最近在学习过程中,接触到ASP.NET Core第三方框架的模块化概念。比如Abpvnext 和 AceFarmework两个框架都是以模块化作为架构基础。
一开始没有理解什么是模块化,以及模块化的好处,现在大概明白了一些了。总结下心得:
模块化简单说:就是把一个项目封装成一个模块。
把一个项目封装成模块的方法:
1,假设我们创建一个新项目叫EntityFrameworkCore,并且用AceFarmework框架。
2,在新项目下新建一个类文件 EntityFrameworkCoreModule.cs,创建一个实体类User.cs,创建对应的DbContext类
3,根据框架说明,通过Nuget安装对应的包.
4,EntityFrameworkCoreModule RelyOn配置AceEntityFrameworkCoreModule,并继承AceModule
[RelyOn(typeof(AceEntityFrameworkCoreModule))]
public class EntityFrameworkCoreModule: AceModule
{
}
5,继承AceModule,重写ConfigureServices,在里面注册、配置好DbContext
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddAceDbContext<DemoDbContext>();
Configure<AceDbContextOptions>(options =>
{
options.UseSqlServer();
});
}
其实AceModule里还有好几个方法可以重写,比如PostConfigureServices,OnApplicationInitialization,PreConfigureServices,OnRouteInitialization,我猜测这些方法应该跟模块的生命周期有关。此处我们只重写了一个ConfigureServices方法。
到此,一个简单的模块封装就完成了,然后其他项目怎么使用这个模块呢?
1,假如还有一个WebApi项目,既然模块化,那么这个主要的入口项目也要模块化改造。
2,新建一个类文件DemoApiModule.cs
3,DemoApiModule类里RelyOn里配置AceAspNetCoreWebModule,然后不是要用上面封装好的模块吗,RelyOn里再新增配置EntityFrameworkCoreModule,并且继承AceModule
[RelyOn(
typeof(AceAspNetCoreWebModule),
typeof(EntityFrameworkCoreModule)
)]
public class DemoApiModule : AceModule
{
}
4,在DemoApiModule里重写ConfigureServices、OnApplicationInitialization两个方法
public override void ConfigureServices(ServiceConfigurationContext context)
{
var servers = context.Services;
servers.AddSwaggerGen();
}
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
var app = context.GetWebApplication();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseAuthorization();
app.MapControllers();
}
其实这2个方法里的内容,是从Program.cs类里抠出来的。按照Ace的话说,把Program.cs掏空了。
5,Program.cs里面就只剩下:
WebApplication.CreateBuilder(args).BuildApplication<DemoApiModule>().Run();
到此,模块化就弄完了,到控制器里,就可以通过构造函数注入DbContext了。此处需要想象DbContext在另外一个项目里,我们把他模块化后,是怎么让他起作用的。
再总结下:
1,每个项目都可以做成一个模块。
2,项目里面拿一个类专门来定义成模块,然后重写ConfigureServices 、 OnApplicationInitialzation等虚方法。
3,弄了新模块,web项目要用时,先引用那个项目,然后再在web项目里的program.cs里DependsOn(RelyOn)配置
4,程序执行时,会根据DependsOn配置内容的顺序,依次把ConfigureServices等里面的东西注册好。