模块化这里说的是在NetCore中,Configure ConfigureServices都是在同一个地方里面配置完所有的信息 比如服务注入容器/身份认证/鉴权授权/中间件的使用等。如果项目大了内容很多都比较不清晰。这里可以通过模块的方式,把每一部分抽象出来,然后通过特性依赖的方式,实现依赖,构成项目。
项目在Github:OpenDeepSpace.Modularity
可以在Nuget上面搜索 OpenDeepSpace.Modularity直接使用
这里你需要实现AbstractModule:
[DependsOnModules(typeof(ModuleB),typeof(ModuleC))]
public class ModuleA : AbstractModule
{
private ILogger<ModuleA> logger;
public override void ConfigureServices(IServiceCollection services)
{
logger = services.BuildServiceProvider().GetRequiredService<ILogger<ModuleA>>();
logger.LogInformation($"{nameof(ModuleA)}.{nameof(ConfigureServices)}");
}
public override void Configure(IApplicationBuilder app) //Configure是可选的实现方法 可以不重载 这是一个virtual方法
{
logger.LogInformation($"{nameof(ModuleA)}.{nameof(Configure)}");
}
}
[DependsOnModules(typeof(ModuleC))]
public class ModuleB : AbstractModule
{
private ILogger<ModuleB> logger;
public override void ConfigureServices(IServiceCollection services)
{
logger = services.BuildServiceProvider().GetRequiredService<ILogger<ModuleB>>();
logger.LogInformation($"{nameof(ModuleB)}.{nameof(ConfigureServices)}");
}
public override void Configure(IApplicationBuilder app)
{
logger.LogInformation($"{nameof(ModuleB)}.{nameof(Configure)}");
}
}
public class ModuleC : AbstractModule
{
private ILogger<ModuleC> logger;
public override void ConfigureServices(IServiceCollection services)
{
logger = services.BuildServiceProvider().GetRequiredService<ILogger<ModuleC>>();
logger.LogInformation($"{nameof(ModuleC)}.{nameof(ConfigureServices)}");
}
public override void Configure(IApplicationBuilder app)
{
logger.LogInformation($"{nameof(ModuleC)}.{nameof(Configure)}");
}
}
然后在对应模块上DependsOnModules来完成依赖:
[DependsOnModules(typeof(ModuleB),typeof(ModuleC))]
public class ModuleA : AbstractModule
使用模块化:
//添加入口Module
builder.Services.AddModule<ModuleA>();
//使用Module
app.UseModule();
上面的完成即可实现不同的模块Configure ConfigureServices各自写在不同的位置,然后只需要依赖即可。
运行结果如下: