天天看點

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 : 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

支付寶掃一掃,為大叔打賞!

Lind.DDD.DynamicModules動态子產品化的設計