Lind.DDD.DynamicModules动态模块化的设计
回到目錄
在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 : classwhere 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架構理解也很新穎!
感謝各位的閱讀!
回到目錄
?
轉載于:https://www.cnblogs.com/lori/p/6647229.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Lind.DDD.DynamicModules动态模块化的设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 游戏盾正式发布:撬动DDoS攻防的天平
- 下一篇: Oracle 维护数据的完整性 一 索引