首页 > 代码库 > Lind.DDD.DynamicModules动态模块化的设计

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架构理解也很新颖!

感谢各位的阅读!

回到目录

 

Lind.DDD.DynamicModules动态模块化的设计