Modularity 模块化
安装
主程序安装 Modularity 包:
dotnet add package IGeekFan.FreeKit.Modularity
概念说明
为避免与 Autofac、ASP.NET Core 中的同名类冲突,本库做了如下重命名:
| 原名 | 本库命名 |
|---|---|
Module | ModuleInfo |
IStartup | IModuleStartup |
使用示例
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);
});
}