回到目录
在Lind.DDD框架里有Module,主要用于全局自动添加的模块,它类似于ABP系统里的Module,但有时过于自动化了可能使系统太死板,而有时将需要的模块手动载入可能对我们更合适,所以大叔又设计了DynamicModules,它在系统初始化时将需要的模块进行注册,然后统一使用它即可。
完美的模块注册
//添加默认模块和全局模块
var config = DynamicModule.Create()
.RegisterGlobalModule()
.UseLogger()
.UseMessaging()
.UseCache();
//添加自定义模块
config.RegisterGenericModule(typeof(IExtensionRepository<>), typeof(EFRepository<>));
模块的使用
//使用模块
var logger = LindContainer.Container.Resolve<ILogger>();
var message = LindContainer.Container.Resolve<IMessageManager>();
var repository = LindContainer.Container.Resolve<IExtensionRepository<UserInfo>>();
var cache = LindContainer.Container.Resolve<ICache>();
在一个WEB程序里,我们经过来模块注册的代码放在global里,在程序启动时一次性加载即可,在模块使用时,可以在需要的地方直接调用它,而在程序的设计上,主要有容器,动态模块管理和动态模块扩展组成,下面分别看一下实现的逻辑!
动态容器
使用autofac实现,主要用来存储对象的生命周期,一个对象的注册,生产和销毁都在这里实现
/// <summary>
/// Lind框架对象容器
/// </summary>
public class LindContainer
{
/// <summary>
/// 容器的生产者
/// </summary>
public static ContainerBuilder Instance
{
get
{
if (instance == null)
{
lock (lockObj)
{
if (instance == null)
instance = new ContainerBuilder();
}
}
return instance;
}
}
/// <summary>
///容器的消费者
/// </summary>
public static IContainer Container
{
get
{
if (container == null)
{
lock (lockObj)
{
if (container == null)
container = instance.Build();
}
}
return container;
}
}
static IContainer container;
static ContainerBuilder instance;
static object lockObj = new object();
}
动态模块管理者
主要提供了注册,生产等功能,这里我们可以扩展出一个泛型对象和普通对象的注册逻辑,在容器设计上我们使用了单例来存储,避免过多的开销
/// <summary>
/// 设计一个模块化注册机制
/// </summary>
public class DynamicModule
{
public static DynamicModule Instance { get; private set; }
private DynamicModule() { }
static ContainerBuilder builder;
public static DynamicModule Create()
{
Instance = new DynamicModule();
return Instance;
}
/// <summary>
/// 注册全局组件
/// </summary>
/// <returns></returns>
public DynamicModule RegisterGlobalModule()
{
this.RegisterModule<ILogger, NormalLogger>();
return this;
}
/// <summary>
/// 注册泛型类型
/// </summary>
/// <typeparam name="TService">接口</typeparam>
/// <typeparam name="TImplement">实现</typeparam>
/// <returns></returns>
public DynamicModule RegisterGenericModule(Type service, Type implement)
{
LindContainer.Instance.RegisterGeneric(implement).As(service);
return this;
}
/// <summary>
/// 注册普通类型
/// </summary>
/// <typeparam name="TService"></typeparam>
/// <typeparam name="TImplement"></typeparam>
/// <returns></returns>
public DynamicModule RegisterModule<TService, TImplement>()
where TService : class
where TImplement : TService
{
LindContainer.Instance.RegisterType(typeof(TImplement)).As(typeof(TService));
return this;
}
}
模块的扩展程序
主要提供了Lind.DDD里的一些模块的注册入口,方便大家以后的注册过程,实质上就是.net里的扩展方法,这个在.net平台得到了广泛的应用!
/// <summary>
/// 模块化扩展
/// </summary>
public static class DynamicModuleExtensions
{
/// <summary>
/// logger
/// </summary>
/// <param name="configuration"></param>
/// <returns></returns>
public static DynamicModule UseLogger(this DynamicModule configuration)
{
configuration.RegisterModule<ILogger, NormalLogger>();
return configuration;
}
/// <summary>
/// message
/// </summary>
/// <param name="configuration"></param>
/// <returns></returns>
public static DynamicModule UseMessaging(this DynamicModule configuration)
{
configuration.RegisterModule<IMessageManager, EmptyMessageManager>();
return configuration;
}
/// <summary>
/// cache
/// </summary>
/// <param name="configuration"></param>
/// <returns></returns>
public static DynamicModule UseCache(this DynamicModule configuration)
{
configuration.RegisterModule<Lind.DDD.Caching.ICache, Lind.DDD.Caching.RedisCache>();
return configuration;
}
}
对于一种技术的研究,思考决定了你对这种技术理解的深度!
感谢汤雪华大师的ECommon,从中也得到了不少启发,还有微信的.net core架构理解也很新颖!
感谢各位的阅读!
作者:仓储大叔,张占岭,
荣誉:微软MVP
QQ:853066980
支付宝扫一扫,为大叔打赏!
