上一篇文章(http://www.javashuo.com/article/p-veljlwtl-bk.html)已經成功將博客項目跑起來了,那麼本篇主要是將以前遺留的問題解決,如今的代碼看起來可能仍是比較混亂,有大量與之無關的代碼存在裏面,對於強迫症患者來講真的是零容忍。html
在程序員界,總有一批強迫症患者,他們但願本身寫的代碼看起來儘可能的完美無瑕疵。git
直奔主題,首先將各項目層的項目文件(.csproj
)打開,格式化一下,沒有引用<Import Project="..\..\common.props" />
這句代碼的也加一下,這裏其實就是將公共屬性拿出來,沒什麼特殊的。程序員
common.props
中的代碼也很是簡單,主要是禁用當開啓輸出XML的時候沒有給代碼進行summary註釋產生的警告,其實這些大可沒必要爲之折騰,不影響項目的成功運行。若是您以爲沒啥必要,徹底能夠跳過此小節看最後。github
.Application
層如今只引用Volo.Abp.Identity.Application
包,和依賴.Application.Caching
、.Application.Contracts
、.Domain.Shared
三個項目。數據庫
//Meowv.Blog.Application.csproj <Project Sdk="Microsoft.NET.Sdk"> <Import Project="..\..\common.props" /> <PropertyGroup> <TargetFramework>netcoreapp3.1</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="Volo.Abp.Identity.Application" Version="2.7.0" /> <ProjectReference Include="..\Meowv.Blog.Application.Caching\Meowv.Blog.Application.Caching.csproj" /> <ProjectReference Include="..\Meowv.Blog.Application.Contracts\Meowv.Blog.Application.Contracts.csproj" /> <ProjectReference Include="..\Meowv.Blog.Domain.Shared\Meowv.Blog.Domain.Shared.csproj" /> </ItemGroup> </Project>
.Application.Caching
層看名字就知道,我準備用它來處理緩存,這裏會用到兩個包,Volo.Abp.Caching
、Microsoft.Extensions.Caching.Redis
。json
無論三七二十一,新建一個模塊類MeowvBlogApplicationCachingModule.cs
,依賴於AbpCachingModule
和咱們的MeowvBlogDomainModule
模塊(此時還沒添加)緩存
using Volo.Abp.Caching; using Volo.Abp.Modularity; namespace Meowv.Blog.Application.Caching { [DependsOn( typeof(AbpCachingModule) // ... )] public class MeowvBlogApplicationCachingModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { base.ConfigureServices(context); } } }
//Meowv.Blog.Application.Caching.csproj <Project Sdk="Microsoft.NET.Sdk"> <Import Project="..\..\common.props" /> <PropertyGroup> <TargetFramework>netcoreapp3.1</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.Extensions.Caching.Redis" Version="2.2.0" /> <PackageReference Include="Volo.Abp.Caching" Version="2.7.0" /> <ProjectReference Include="..\Meowv.Blog.Application.Contracts\Meowv.Blog.Application.Contracts.csproj" /> <ProjectReference Include="..\Meowv.Blog.Domain.Shared\Meowv.Blog.Domain.Shared.csproj" /> <ProjectReference Include="..\Meowv.Blog.ToolKits\Meowv.Blog.ToolKits.csproj" /> </ItemGroup> </Project>
刪掉裏面全部文件,.Application.Contracts
層我不許備按照abp那樣來作,此層我只想用來放咱們的傳輸對象(DTO),添加項目引用Domain.Shared
,同時開啓輸出XML文件到咱們.HttpApi.Hosting
app
輸出XML很簡單,在 Visual Studio 中對着項目 右鍵=>屬性=>生成=>輸出,而後選擇XML文檔文件,默認爲一個物理路徑,咱們將其改成相對路徑..\Meowv.Blog.HttpApi.Hosting\Meowv.Blog.Application.Contracts.xml
,XML輸出到.HttpApi.Hosting
層。dom
也能夠直接修改項目文件實現,以下ide
//Meowv.Blog.Application.Contracts.csproj <Project Sdk="Microsoft.NET.Sdk"> <Import Project="..\..\common.props" /> <PropertyGroup> <TargetFramework>netcoreapp3.1</TargetFramework> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'"> <DocumentationFile>..\Meowv.Blog.HttpApi.Hosting\Meowv.Blog.Application.Contracts.xml</DocumentationFile> </PropertyGroup> <ItemGroup> <ProjectReference Include="..\Meowv.Blog.Domain.Shared\Meowv.Blog.Domain.Shared.csproj" /> </ItemGroup> </Project>
.Domain
層爲咱們的實體領域模型,不須要引用其它層,只添加包Volo.Abp.Identity.Domain
,同時也輸出一下XML文件,XML文件的做用後續Swagger會用的。
//Meowv.Blog.Domain.csproj <Project Sdk="Microsoft.NET.Sdk"> <Import Project="..\..\common.props" /> <PropertyGroup> <TargetFramework>netcoreapp3.1</TargetFramework> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'"> <DocumentationFile>..\Meowv.Blog.HttpApi.Hosting\Meowv.Blog.Domain.xml</DocumentationFile> </PropertyGroup> <ItemGroup> <PackageReference Include="Volo.Abp.Identity.Domain" Version="2.7.0" /> <ProjectReference Include="..\Meowv.Blog.Domain.Shared\Meowv.Blog.Domain.Shared.csproj" /> </ItemGroup> </Project>
刪掉此層全部文件,不要忘了添加模塊類,MeowvBlogDomainModule.cs
,它依賴AbpIdentityDomainModule
模塊
using Volo.Abp.Identity; using Volo.Abp.Modularity; namespace Meowv.Blog.Domain { [DependsOn(typeof(AbpIdentityDomainModule))] public class MeowvBlogDomainModule : AbpModule { } }
此時上面.Application.Caching
中能夠將MeowvBlogDomainModule
加上了。
//MeowvBlogApplicationCachingModule.cs ... [DependsOn( typeof(AbpCachingModule), typeof(MeowvBlogDomainModule) )] public class MeowvBlogApplicationCachingModule : AbpModule { ... } ...
.Domain.Shared
層至關於.Domain
的一個擴展同樣,這裏放一下項目用到的枚舉、公共常量等內容,須要引用咱們的.Domain
項目
<Project Sdk="Microsoft.NET.Sdk"> <Import Project="..\..\common.props" /> <PropertyGroup> <TargetFramework>netcoreapp3.1</TargetFramework> </PropertyGroup> <ItemGroup> <ProjectReference Include="..\Meowv.Blog.Domain\Meowv.Blog.Domain.csproj" /> </ItemGroup> </Project>
仍是要新增一個模塊類MeowvBlogDomainSharedModule.cs
,它依賴AbpIdentityDomainSharedModule
模塊
//MeowvBlogDomainSharedModule.cs using Volo.Abp.Identity; using Volo.Abp.Modularity; namespace Meowv.Blog.Domain { [DependsOn(typeof(AbpIdentityDomainModule))] public class MeowvBlogDomainModule : AbpModule { } }
.EntityFrameworkCore
層一樣的,先刪掉默認生成的文件。它主要是集成了EF Core,自定義倉儲。詳細能夠看看abp文檔:https://docs.abp.io/zh-Hans/abp/latest/Repositories
它支持多種數據庫 MySQL、SqlServer、PostgreSql、Sqlite等,若是你有用到MongoDB,則須要新建一個項目,單獨實現。能夠看官方文檔,有時間能夠分享具體方法,本項目用不到。https://docs.abp.io/zh-Hans/abp/latest/MongoDB
爲了方便你們,我把以上4種主流數據庫都集成到項目中,添加包Volo.Abp.EntityFrameworkCore.MySQL
,.PostgreSql
、.Sqlite
、.SqlServer
,同時引用.Domain.Shared
項目
//Meowv.Blog.EntityFrameworkCore.csproj <Project Sdk="Microsoft.NET.Sdk"> <Import Project="..\..\common.props" /> <PropertyGroup> <TargetFramework>netcoreapp3.1</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="Volo.Abp.EntityFrameworkCore.MySQL" Version="2.7.0" /> <PackageReference Include="Volo.Abp.EntityFrameworkCore.PostgreSql" Version="2.7.0" /> <PackageReference Include="Volo.Abp.EntityFrameworkCore.Sqlite" Version="2.7.0" /> <PackageReference Include="Volo.Abp.EntityFrameworkCore.SqlServer" Version="2.7.0" /> <ProjectReference Include="..\Meowv.Blog.Domain.Shared\Meowv.Blog.Domain.Shared.csproj" /> </ItemGroup> </Project>
新建一個模塊類MeowvBlogFrameworkCoreModule.cs
,依賴MeowvBlogDomainModule
和數據庫模塊
//MeowvBlogFrameworkCoreModule.cs using Meowv.Blog.Domain; using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore.MySQL; using Volo.Abp.EntityFrameworkCore.PostgreSql; using Volo.Abp.EntityFrameworkCore.Sqlite; using Volo.Abp.EntityFrameworkCore.SqlServer; using Volo.Abp.Modularity; namespace Meowv.Blog.EntityFrameworkCore { [DependsOn( typeof(MeowvBlogDomainModule), typeof(AbpEntityFrameworkCoreModule), typeof(AbpEntityFrameworkCoreMySQLModule), typeof(AbpEntityFrameworkCoreSqlServerModule), typeof(AbpEntityFrameworkCorePostgreSqlModule), typeof(AbpEntityFrameworkCoreSqliteModule) )] public class MeowvBlogFrameworkCoreModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { } } }
.EntityFrameworkCore.DbMigrations
層主要作數據庫遷移,用code-first方式建立數據庫表,先刪掉默認生成的文件,目前還用不上,後面講。
.ToolKits
層是咱們手動建立的項目,我主要用它來包裝一些擴展方法,公共的工具類。
作.net core開發的,相信Swagger的使用你們應該都很熟悉了,不作過多的介紹,今天只先將其用上看看效果。
我單獨爲Swagger新建了一個項目Meowv.Blog.Swagger
,其實大可沒必要,直接寫在.HttpApi.Hosting
中也是同樣的。
添加Volo.Abp.AspNetCore
和Swashbuckle.AspNetCore
包,引用實體層.Domain
。
//Meowv.Blog.Swagger.csproj <Project Sdk="Microsoft.NET.Sdk"> <Import Project="..\..\common.props" /> <PropertyGroup> <TargetFramework>netcoreapp3.1</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="Volo.Abp.AspNetCore" Version="2.7.0" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="5.4.1" /> <ProjectReference Include="..\Meowv.Blog.Domain\Meowv.Blog.Domain.csproj" /> </ItemGroup> </Project>
添加模塊類MeowvBlogSwaggerModule.cs
,依賴MeowvBlogDomainModule
模塊,而且重寫ConfigureServices
和OnApplicationInitialization
方法,不知道這是什麼的,能夠看文檔:https://docs.abp.io/zh-Hans/abp/latest/Module-Development-Basics
而後新建一個擴展類MeowvBlogSwaggerExtensions.cs
,編寫兩個擴展方法AddSwagger
和UseSwaggerUI
。
在AddSwagger
方法中引用咱們的XML文件,配置接口的名稱版本以及描述信息,在UseSwaggerUI
方法中使用SwaggerUI,代碼以下:
//MeowvBlogSwaggerExtensions.cs using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using Microsoft.OpenApi.Models; using System; using System.IO; namespace Meowv.Blog.Swagger { public static class MeowvBlogSwaggerExtensions { public static IServiceCollection AddSwagger(this IServiceCollection services) { return services.AddSwaggerGen(options => { options.SwaggerDoc("v1", new OpenApiInfo { Version = "1.0.0", Title = "個人接口啊", Description = "接口描述" }); options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, "Meowv.Blog.HttpApi.xml")); options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, "Meowv.Blog.Domain.xml")); options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, "Meowv.Blog.Application.Contracts.xml")); }); } public static void UseSwaggerUI(this IApplicationBuilder app) { app.UseSwaggerUI(options => { options.SwaggerEndpoint($"/swagger/v1/swagger.json", "默認接口"); }); } } }
隨後即可以在模塊MeowvBlogDomainModule
中引用了
//MeowvBlogSwaggerModule.cs using Meowv.Blog.Domain; using Microsoft.AspNetCore.Builder; using Volo.Abp; using Volo.Abp.Modularity; namespace Meowv.Blog.Swagger { [DependsOn(typeof(MeowvBlogDomainModule))] public class MeowvBlogSwaggerModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { context.Services.AddSwagger(); } public override void OnApplicationInitialization(ApplicationInitializationContext context) { context.GetApplicationBuilder().UseSwagger().UseSwaggerUI(); } } }
最後在.HttpApi.Hosting
層的的啓動模塊中引用一下。
//MeowvBlogHttpApiHostingModule.cs ... [DependsOn( typeof(AbpAspNetCoreMvcModule), typeof(AbpAutofacModule), typeof(MeowvBlogHttpApiModule), typeof(MeowvBlogSwaggerModule), typeof(MeowvBlogFrameworkCoreModule) )] public class MeowvBlogHttpApiHostingModule : AbpModule { ... } ...
Ctrl + Shift + B
生成解決方案,Ctrl+F5
打開 .../swagger/index.html 看看效果,上面有一個坑沒有填,不知道你們發現了沒有,Meowv.Blog.HttpApi.xml
沒有生成,啓動是是會報錯的,你們按照以前的方法自行生成XML便可。
棒!預期已經達到了。Swagger之因此想單首創建一個項目是由於還涉及到不少內容,如接口分組、JWT受權、還有Swagger文檔描述信息的Filter等。
項目中還剩下.BackgroundJobs
層沒有處理,此層準備集成Hangfire
作一個定時任務處理的,後面會慢慢用起來的。
如今再回頭看看,項目是否是很清爽? 沒有亂七八糟的東西,有的只是咱們須要的。
此時的層級目錄,以供參考。
項目中可能有許多不是很合理的地方,請酌情參考。由於大佬們都不肯意出來分享,因此咱們渣渣只能作到這種程度,若是有錯誤歡迎指正,謝謝。