回到目錄
在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
支付寶掃一掃,為大叔打賞!
