a library for modular develop based on Microsoft.Extensions.DependencyInjection. 基于 Microsoft.Extensions.DependencyInjection 的模块化开发库。
$ dotnet add package Cuture.Extensions.Modularity围绕 Microsoft.Extensions.DependencyInjection.Abstractions 为核心的.Net模块化开发库.
Type、Assembly、File、Directory的模块加载;IOptions<TOptions>自动绑定;Microsoft.Extensions.DependencyInjection.Abstractions,Hosting项目额外依赖Hosting.Abstractions、Configuration.Binder、Options;| Package | Description |
|---|---|
| Cuture.Extensions.Modularity | 模块化的核心库 |
| Cuture.Extensions.Modularity.Hosting | 对Host的模块化支持库,用于在通用主机中加载模块 |
Nuget包Install-Package Cuture.Extensions.Modularity
[DependsOn(
typeof(DependsSampleModule1),
typeof(DependsSampleModule2)
)] //定义依赖的模块
[AutoRegisterServicesInAssembly]
public class SampleModule : AppModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
//进行模块需要的配置
}
}
[DependsOn]:声明此模块依赖的模块,加载顺序与声明顺序相同;(可选)[AutoRegisterServicesInAssembly]:有此特性的模块将会自动将所在程序集中使用ExportServices标记的导出服务注入到DI容器;(可选)1.1.6之后默认自动注册,使用[DisableAssemblyServicesRegister]特性进行手动关闭AppModule:标准的模块只需要继承IAppModule即可。如果需要单独的配置,则可以单独实现IPreConfigureServices、IConfigureServices、IPostConfigureServices、IOnPreApplicationInitialization、IOnApplicationInitialization、IOnPostApplicationInitialization、IOnApplicationShutdown以在对应的时机进行配置,或直接继承AppModule并重写对应的方法;所有方法都有异步版本IPreConfigureServicesAsync、IConfigureServicesAsync、IPostConfigureServicesAsync、IOnPreApplicationInitializationAsync、IOnApplicationInitializationAsync、IOnPostApplicationInitializationAsync、IOnApplicationShutdownAsync,或直接继承AsyncAppModule;Microsoft.Extensions.DependencyInjection包,视主项目而定var services = new ServiceCollection();
//加载模块
services.LoadModule<SampleModule>() //直接从类型加载
.LoadModuleFile(modulePath) //从文件加载
.LoadModuleDirectory(source =>
{
source.SearchDepth = 5; //设置文件夹搜索深度
}, moduleDirectory) //从文件夹加载
.ModuleLoadComplete() //必须调用此方法,以确认模块加载完成
using (var serviceProvider = services.BuildServiceProvider())
{
//必须调用此方法,以初始化模块
serviceProvider.InitializationModulesWithOutHostLifetime();
//这里使用初始化了模块的serviceProvider
//关闭模块
serviceProvider.ShutdownModules();
}
Note:
Install-Package Cuture.Extensions.Modularity.Hosting
Host.CreateDefaultBuilder(args)
.LoadModule<SampleModule>() //直接从类型加载
.LoadModuleFile(modulePath) //从文件加载
.LoadModuleDirectory(source =>
{
source.SearchDepth = 5; //设置文件夹搜索深度
}, moduleDirectory) //从文件夹加载
.UseConsoleLifetime()
.InitializationModules() //必须调用此方法,以初始化模块
.Run();
更多细节详见示例代码;
所在程序集的模块标记特性[AutoRegisterServicesInAssembly][ExportServices(ServiceLifetime.Singleton, AddDIMode.Replace, typeof(IHello))]
public class Hello : IHello
{
public string SayHello()
{
return "Hello";
}
}
示例代码会自动将Hello类型以单例模式注册为IHello服务,并在注入时使用Replace方法。
参数:
Add、TryAdd、Replace;除示例的ExportServices外,还有ExportSingletonServices、ExportScopedServices、ExportTransientServices等多个拓展特性的重载实现;
IOptions<TOptions>自动绑定IOptions<TOptions>的类;IConfiguration查找节点,并绑定值;A 类命名空间为 B.C.D.E.F ,则IConfiguration查找路径为 B:C:D:E:F:A;IConfiguration !!! 详见示例项目;示例配置代码:
AutoBindModuleOptions() 方法即可;Host.CreateDefaultBuilder(args)
.ConfigureHostConfiguration(builder => builder.AddJsonFile("appsettings.Development.json"))
.LoadModule<HostSampleModule>()
.AutoBindModuleOptions() //自动使用 IConfiguration 绑定模块中继承了 IOptions<TOptions> 的类
.UseConsoleLifetime()
.InitializationModules()
.Run();
参考示例项目OtherModuleSystemAdaptSample
Mermaid字符串var abpModuleDescriptors = AppModuleDependencyUtil.FindAllDependedModuleDescriptors(typeof(XXXModule));
var mermaidString = abpModuleDescriptors.ToMermaidString();
然后将mermaidString复制到支持mermaid的编辑器就能查看模块依赖关系了。