回到目錄 在Lind.DDD框架里有Module,主要用於全局自動添加的模塊,它類似於ABP系統里的Module,但有時過於自動化了可能使系統太死板,而有時將需要的模塊手動載入可能對我們更合適,所以大叔又設計了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 : 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架構理解也很新穎!
感謝各位的閱讀!