1. 程式人生 > >基於 abp vNext 和 .NET Core 開發部落格專案 - 給專案瘦身,讓它跑起來

基於 abp vNext 和 .NET Core 開發部落格專案 - 給專案瘦身,讓它跑起來

上一篇文章(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