文章出處

回到目錄

在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架構理解也很新穎!

感謝各位的閱讀!

回到目錄

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜

    大師兄 發表在 痞客邦 留言(0) 人氣()