基於 abp vNext 和 .NET Core 開發部落格專案 - 給專案瘦身,讓它跑起來
阿新 • • 發佈:2020-05-17
上一篇文章(https://www.cnblogs.com/meowv/p/12896177.html)已經成功建立了部落格專案,但是abp預設給我們引用了許多專案中用不到的元件。
本篇文章將給專案進行瘦身,刪掉對我們來說暫時用不到的元件。講解各個模組之間的關係,寫一個Hello World,讓其成功執行起來。
## 給專案瘦身
### Meowv.Blog.HttpApi.Hosting
`Meowv.Blog.HttpApi.Hosting`相當於一個web專案,但這裡主要依賴於`Meowv.Blog.HttpApi`模組,用來暴露我們的API的。
刪掉`Meowv.Blog.HttpApi.Hosting`專案中abp自己生成的檔案和資料夾,只留下`Program.cs`和`Startup.cs`兩個類。
在abp中,每個模組都應該定義一個模組類,派生自`AbpModule`,那麼就新增一個模組類`MeowvBlogHttpApiHostingModule.cs`
`AbpModule`類中可以做 配置服務前和後的操作,應用程式初始化,應用程式初始化前和後,應用程式關閉和模組依賴等一系列操作,詳看,https://docs.abp.io/en/abp/latest/Module-Development-Basics
為了方便,在這裡直接整合Autofac,來替換官方依賴注入,詳看,https://docs.abp.io/zh-Hans/abp/latest/Autofac-Integration
於是我們的模組類就變成下面這個樣子。
```CSharp
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Hosting;
using Volo.Abp;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.Autofac;
using Volo.Abp.Modularity;
namespace Meowv.Blog.HttpApi.Hosting
{
[DependsOn(
typeof(AbpAspNetCoreMvcModule),
typeof(AbpAutofacModule)
)]
public class MeowvBlogHttpApiHostingModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
base.ConfigureServices(context);
}
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
var app = context.GetApplicationBuilder();
var env = context.GetEnvironment();
// 環境變數,開發環境
if (env.IsDevelopment())
{
// 生成異常頁面
app.UseDeveloperExceptionPage();
}
// 路由
app.UseRouting();
// 路由對映
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
}
```
然後在`Startup.cs`使用,`services.AddApplication();`
繼續修改`Program.cs`程式碼,如下:
```CSharp
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using System.Threading.Tasks;
namespace Meowv.Blog.HttpApi.Hosting
{
public class Program
{
public static async Task Main(string[] args)
{
await Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(builder =>
{
builder.UseIISIntegration()
.UseStartup();
}).UseAutofac().Build().RunAsync();
}
}
}
```
然後編輯一下專案檔案,`Meowv.Blog.HttpApi.Hosting.csproj`,刪掉無用的配置檔案資訊和abp預設引用的元件。
```xml
netcoreapp3.1
```
### Meowv.Blog.HttpApi
`Meowv.Blog.HttpApi`職責主要是編寫Controller,所有的API都寫在這裡,同時它要依賴於`Meowv.Blog.Application`模組
先刪掉Models資料夾和預設的Controller,修改預設模組類名稱為:`MeowvBlogHttpApiModule`,並刪掉無用的依賴項
```CSharp
using Volo.Abp.Identity;
using Volo.Abp.Modularity;
namespace Meowv.Blog.HttpApi
{
[DependsOn(
typeof(AbpIdentityHttpApiModule)
)]
public class MeowvBlogHttpApiModule : AbpModule
{
}
}
```
編輯專案檔案`Meowv.Blog.HttpApi.csproj`
```xml
netcoreapp3.1
```
### Meowv.Blog.Application
`Meowv.Blog.Application`為我們的應用服務層,在這裡編寫服務的介面以及對應的實現
首先還是模組類,`MeowvBlogApplicationModule`,在這裡我們應該整合快取和AutoMapper,這個先留著,先把專案瘦身跑起來後面在說吧。
```CSharp
using Volo.Abp.Identity;
using Volo.Abp.Modularity;
namespace Meowv.Blog.Application
{
[DependsOn(
typeof(AbpIdentityApplicationModule)
)]
public class MeowvBlogApplicationModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
}
}
}
```
新建一個`MeowvBlogApplicationServiceBase.cs`繼承自`ApplicationService`,然後就可以先寫一個Hello World的應用服務介面和實現。
```CSharp
//IHelloWorldService.cs
namespace Meowv.Blog.Application.HelloWorld
{
public interface IHelloWorldService
{
string HelloWorld();
}
}
```
```CSharp
//HelloWorldService.cs
namespace Meowv.Blog.Application.HelloWorld.Impl
{
public class HelloWorldService : ServiceBase, IHelloWorldService
{
public string HelloWorld()
{
return "Hello World";
}
}
}
```
> 這裡有兩點需要注意,我們的服務都以Service結尾,每個服務都應該繼承我們編寫的的基類`ServiceBase`
然後在`Meowv.Blog.HttpApi`層中添引用:`Meowv.Blog.Application`,同時新增依賴模組類,`MeowvBlogApplicationModule`
```CSharp
//MeowvBlogHttpApiModule.cs
using Meowv.Blog.Application;
using Volo.Abp.Identity;
using Volo.Abp.Modularity;
namespace Meowv.Blog.HttpApi
{
[DependsOn(
typeof(AbpIdentityHttpApiModule),
typeof(MeowvBlogApplicationModule)
)]
public class MeowvBlogHttpApiModule : AbpModule
{
}
}
```
## 讓它跑起來
好了,完成以上步驟,基本上差不多了,在`Meowv.Blog.HttpApi`中新增一個 Controller,`HelloWorldController.cs`
```CSharp
using Meowv.Blog.Application.HelloWorld;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp.AspNetCore.Mvc;
namespace Meowv.Blog.HttpApi.Controllers
{
[ApiController]
[Route("[controller]")]
public class HelloWorldController : AbpController
{
private readonly IHelloWorldService _helloWorldService;
public HelloWorldController(IHelloWorldService helloWorldService)
{
_helloWorldService = helloWorldService;
}
[HttpGet]
public string HelloWorld()
{
return _helloWorldService.HelloWorld();
}
}
}
```
ok,執行一下`Meowv.Blog.HttpApi.Hosting`試試看,不出意料應該會報錯的,因為我們在啟動層`Meowv.Blog.HttpApi.Hosting`沒有依賴`MeowvBlogHttpApiModule`模組,新增上試試
```CSharp
...
[DependsOn(
typeof(AbpAspNetCoreMvcModule),
typeof(AbpAutofacModule),
typeof(MeowvBlogHttpApiModule)
)]
public class MeowvBlogHttpApiHostingModule : AbpModule
{
...
}
...
```
搞定,成功出現Hello World,目標圓滿完成。
![1](https://img2020.cnblogs.com/blog/891843/202005/891843-20200517123252334-230893510.png)
放一張此時專案的層級目錄,以供參考
![2](https://img2020.cnblogs.com/blog/891843/202005/891843-20200517125505684-525194586.png)
以上就是本章全部內容,暫時只用到了其中三個專案層便成功執行,由於時間問題,其中還有許多需要完善的地方沒有操作,但後續用到的時候會逐步優化掉。
開源地址:https://github.com/Meowv/Blog/tree/blog_tutorial