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

    感谢各位的阅读!

    回到目录

  • 相关阅读:
    2015抢票记事
    Provide your license server administrator with the following information.error code =-42,147
    微信支付现金红包接口
    SQL Server 触发器
    SQL增删查改注意的事项
    SQL while循环
    SQL SERVER 中is null 和 is not null 将会导致索引失效吗?
    HTML中head里的内容经浏览器解析后全到body里了
    sqLSERVER 计划缓存
    通用分页存储过程
  • 原文地址:https://www.cnblogs.com/lori/p/6647229.html
Copyright © 2020-2023  润新知