跳到主要内容

Modularity 模块化

参考实现:aspnetcore-modular-monolith

安装

主程序安装 Modularity 包:

dotnet add package IGeekFan.FreeKit.Modularity

概念说明

为避免与 Autofac、ASP.NET Core 中的同名类冲突,本库做了如下重命名:

原名本库命名
ModuleModuleInfo
IStartupIModuleStartup

使用示例

1. 模块类库 — 实现 IModuleStartup

public class Module1Startup : IModuleStartup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IMyService, MyService>();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}

模块控制器使用 [module] 路由令牌,会自动替换为注册时指定的路由前缀:

[Route("[module]/[controller]")]
public class DemoController : ControllerBase
{
[HttpGet]
public string Get() => "Hello from Module1";
}

2. 主程序 — 注册模块

// 注册路由前缀约定
builder.Services.AddTransient<IPostConfigureOptions<MvcOptions>, ModuleRoutingMvcOptionsPostConfigure>();

// 注册各模块,指定路由前缀
builder.Services.AddModule<Module1.Module1Startup>("module-1", builder.Configuration);
builder.Services.AddModule<Module2.Module2Startup>("module-2", builder.Configuration);

3. 主程序 — 启用模块中间件

// 挂载各模块的中间件管道
var modules = app.Services.GetRequiredService<IEnumerable<ModuleInfo>>();
foreach (var module in modules)
{
app.Map($"/{module.RoutePrefix}", branch =>
{
branch.UseRouting();
module.Startup.Configure(branch, app.Environment);
});
}

完成后,module-1 下的所有路由自动带上 /module-1 前缀。

app.Map($"/{module.RoutePrefix}", builder =>
{
builder.UseRouting();
module.Startup.Configure(builder, app.Environment);
});
}