基于 abp vNext 和 .NET Core 开发博客项目 - 完善与美化,Swagger登场
基于 abp vNext 和 .NET Core 開發(fā)博客項(xiàng)目 - 完善與美化,Swagger登場(chǎng)
轉(zhuǎn)載于:https://github.com/Meowv/Blog.git
在程序員界,總有一批強(qiáng)迫癥患者,他們希望自己寫的代碼看起來盡量的完美無瑕疵。
完善與美化
直奔主題,首先將各項(xiàng)目層的項(xiàng)目文件(.csproj)打開,格式化一下,沒有引用這句代碼的也加一下,這里其實(shí)就是將公共屬性拿出來,沒什么特殊的。
common.props中的代碼也非常簡(jiǎn)單,主要是禁用當(dāng)開啟輸出XML的時(shí)候沒有給代碼進(jìn)行summary注釋產(chǎn)生的警告,其實(shí)這些大可不必為之折騰,不影響項(xiàng)目的成功運(yùn)行。如果您覺得沒啥必要,完全可以跳過此小節(jié)看最后。
.Application
.Application層現(xiàn)在只引用Volo.Abp.Identity.Application包,和依賴.Application.Caching、.Application.Contracts、.Domain.Shared三個(gè)項(xiàng)目。
//Meowv.Blog.Application.csproj
.Application.Caching
.Application.Caching層看名字就知道,我準(zhǔn)備用它來處理緩存,這里會(huì)用到兩個(gè)包,Volo.Abp.Caching、Microsoft.Extensions.Caching.Redis
不管三七二十一,新建一個(gè)模塊類MeowvBlogApplicationCachingModule.cs,依賴于AbpCachingModule和我們的MeowvBlogDomainModule模塊(此時(shí)還沒添加)
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
.Application.Contracts
刪掉里面所有文件,.Application.Contracts層我不準(zhǔn)備按照abp那樣來做,此層我只想用來放我們的傳輸對(duì)象(DTO),添加項(xiàng)目引用Domain.Shared,同時(shí)開啟輸出XML文件到我們.HttpApi.Hosting
輸出XML很簡(jiǎn)單,在 Visual Studio 中對(duì)著項(xiàng)目 右鍵=>屬性=>生成=>輸出,然后選擇XML文檔文件,默認(rèn)為一個(gè)物理路徑,我們將其改為相對(duì)路徑…\Meowv.Blog.HttpApi.Hosting\Meowv.Blog.Application.Contracts.xml,XML輸出到.HttpApi.Hosting層。
也可以直接修改項(xiàng)目文件實(shí)現(xiàn),如下
//Meowv.Blog.Application.Contracts.csproj
.Domain
.Domain層為我們的實(shí)體領(lǐng)域模型,不需要引用其它層,只添加包Volo.Abp.Identity.Domain,同時(shí)也輸出一下XML文件,XML文件的作用后續(xù)Swagger會(huì)用的。
//Meowv.Blog.Domain.csproj
刪掉此層所有文件,不要忘了添加模塊類,MeowvBlogDomainModule.cs,它依賴AbpIdentityDomainModule模塊
using Volo.Abp.Identity;
using Volo.Abp.Modularity;
namespace Meowv.Blog.Domain
{
[DependsOn(typeof(AbpIdentityDomainModule))]
public class MeowvBlogDomainModule : AbpModule
{
}
此時(shí)上面.Application.Caching中可以將MeowvBlogDomainModule加上了。
//MeowvBlogApplicationCachingModule.cs
…
[DependsOn(
typeof(AbpCachingModule),
typeof(MeowvBlogDomainModule)
)]
public class MeowvBlogApplicationCachingModule : AbpModule
{
…
}
…
.Domain.Shared
.Domain.Shared層相當(dāng)于.Domain的一個(gè)擴(kuò)展一樣,這里放一下項(xiàng)目用到的枚舉、公共常量等內(nèi)容,需要引用我們的.Domain項(xiàng)目
netcoreapp3.1 還是要新增一個(gè)模塊類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
.EntityFrameworkCore層同樣的,先刪掉默認(rèn)生成的文件。它主要是集成了EF Core,自定義倉儲(chǔ)。詳細(xì)可以看看abp文檔:https://docs.abp.io/zh-Hans/abp/latest/Repositories
它支持多種數(shù)據(jù)庫 MySQL、SqlServer、PostgreSql、Sqlite等,如果你有用到MongoDB,則需要新建一個(gè)項(xiàng)目,單獨(dú)實(shí)現(xiàn)。可以看官方文檔,有時(shí)間可以分享具體方法,本項(xiàng)目用不到。https://docs.abp.io/zh-Hans/abp/latest/MongoDB
為了方便大家,我把以上4種主流數(shù)據(jù)庫都集成到項(xiàng)目中,添加包Volo.Abp.EntityFrameworkCore.MySQL,.PostgreSql、.Sqlite、.SqlServer,同時(shí)引用.Domain.Shared項(xiàng)目
//Meowv.Blog.EntityFrameworkCore.csproj
新建一個(gè)模塊類MeowvBlogFrameworkCoreModule.cs,依賴MeowvBlogDomainModule和數(shù)據(jù)庫模塊
//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
.EntityFrameworkCore.DbMigrations層主要做數(shù)據(jù)庫遷移,用code-first方式創(chuàng)建數(shù)據(jù)庫表,先刪掉默認(rèn)生成的文件,目前還用不上,后面講。
.ToolKits
.ToolKits層是我們手動(dòng)創(chuàng)建的項(xiàng)目,我主要用它來包裝一些擴(kuò)展方法,公共的工具類。
Swagger登場(chǎng)
做.net core開發(fā)的,相信Swagger的使用大家應(yīng)該都很熟悉了,不做過多的介紹,今天只先將其用上看看效果。
我單獨(dú)為Swagger新建了一個(gè)項(xiàng)目Meowv.Blog.Swagger,其實(shí)大可不必,直接寫在.HttpApi.Hosting中也是一樣的。
添加Volo.Abp.AspNetCore和Swashbuckle.AspNetCore包,引用實(shí)體層.Domain。
//Meowv.Blog.Swagger.csproj
添加模塊類MeowvBlogSwaggerModule.cs,依賴MeowvBlogDomainModule模塊,并且重寫ConfigureServices和OnApplicationInitialization方法,不知道這是什么的,可以看文檔:https://docs.abp.io/zh-Hans/abp/latest/Module-Development-Basics
然后新建一個(gè)擴(kuò)展類MeowvBlogSwaggerExtensions.cs,編寫兩個(gè)擴(kuò)展方法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 = “接口描述”
});
}
隨后便可以在模塊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();
}
}
最后在.HttpApi.Hosting層的的啟動(dòng)模塊中引用一下。
//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 看看效果,上面有一個(gè)坑沒有填,不知道大家發(fā)現(xiàn)了沒有,Meowv.Blog.HttpApi.xml沒有生成,啟動(dòng)是是會(huì)報(bào)錯(cuò)的,大家按照之前的方法自行生成XML即可。
圖片
棒!預(yù)期已經(jīng)達(dá)到了。Swagger之所以想單獨(dú)創(chuàng)建一個(gè)項(xiàng)目是因?yàn)檫€涉及到很多內(nèi)容,如接口分組、JWT授權(quán)、還有Swagger文檔描述信息的Filter等。
項(xiàng)目中還剩下.BackgroundJobs層沒有處理,此層準(zhǔn)備集成Hangfire做一個(gè)定時(shí)任務(wù)處理的,后面會(huì)慢慢用起來的。
現(xiàn)在再回頭看看,項(xiàng)目是不是很清爽? 沒有亂七八糟的東西,有的只是我們需要的。
此時(shí)的層級(jí)目錄,以供參考。
圖片
項(xiàng)目中可能有許多不是很合理的地方,請(qǐng)酌情參考。因?yàn)榇罄袀兌疾辉敢獬鰜矸窒?#xff0c;所以我們?cè)荒茏龅竭@種程度,如果有錯(cuò)誤歡迎指正,謝謝。
開源地址:https://github.com/Meowv/Blog/tree/blog_tutorial
總結(jié)
以上是生活随笔為你收集整理的基于 abp vNext 和 .NET Core 开发博客项目 - 完善与美化,Swagger登场的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于 abp vNext 和 .NET
- 下一篇: 基于 abp vNext 和 .NET