ASP.NET Core第三方框架模块化学习心得

最近在学习过程中,接触到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等里面的东西注册好。