博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Lind.DDD.DynamicModules动态模块化的设计
阅读量:5991 次
发布时间:2019-06-20

本文共 4518 字,大约阅读时间需要 15 分钟。

在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
();var message = LindContainer.Container.Resolve
();var repository = LindContainer.Container.Resolve
>();var cache = LindContainer.Container.Resolve
();

在一个WEB程序里,我们经过来模块注册的代码放在global里,在程序启动时一次性加载即可,在模块使用时,可以在需要的地方直接调用它,而在程序的设计上,主要有容器,动态模块管理和动态模块扩展组成,下面分别看一下实现的逻辑!

动态容器

使用autofac实现,主要用来存储对象的生命周期,一个对象的注册,生产和销毁都在这里实现

///     /// Lind框架对象容器    ///     public class LindContainer    {        ///         /// 容器的生产者        ///         public static ContainerBuilder Instance        {            get            {                if (instance == null)                {                    lock (lockObj)                    {                        if (instance == null)                            instance = new ContainerBuilder();                    }                }                return instance;            }        }        ///         ///容器的消费者        ///         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();    }

动态模块管理者

主要提供了注册,生产等功能,这里我们可以扩展出一个泛型对象和普通对象的注册逻辑,在容器设计上我们使用了单例来存储,避免过多的开销

///     /// 设计一个模块化注册机制    ///     public class DynamicModule    {        public static DynamicModule Instance { get; private set; }        private DynamicModule() { }        static ContainerBuilder builder;        public static DynamicModule Create()        {            Instance = new DynamicModule();            return Instance;        }        ///         /// 注册全局组件        ///         /// 
public DynamicModule RegisterGlobalModule() { this.RegisterModule
(); return this; } ///
/// 注册泛型类型 /// ///
接口
///
实现
///
public DynamicModule RegisterGenericModule(Type service, Type implement) { LindContainer.Instance.RegisterGeneric(implement).As(service); return this; } ///
/// 注册普通类型 /// ///
///
///
public DynamicModule RegisterModule
() where TService : class where TImplement : TService { LindContainer.Instance.RegisterType(typeof(TImplement)).As(typeof(TService)); return this; } }

模块的扩展程序

主要提供了Lind.DDD里的一些模块的注册入口,方便大家以后的注册过程,实质上就是.net里的扩展方法,这个在.net平台得到了广泛的应用!

///     /// 模块化扩展    ///     public static class DynamicModuleExtensions    {        ///         /// logger        ///         ///         /// 
public static DynamicModule UseLogger(this DynamicModule configuration) { configuration.RegisterModule
(); return configuration; } ///
/// message /// ///
///
public static DynamicModule UseMessaging(this DynamicModule configuration) { configuration.RegisterModule
(); return configuration; } ///
/// cache /// ///
///
public static DynamicModule UseCache(this DynamicModule configuration) { configuration.RegisterModule
(); return configuration; } }

对于一种技术的研究,思考决定了你对这种技术理解的深度!

感谢汤雪华大师的ECommon,从中也得到了不少启发,还有微信的.net core架构理解也很新颖!

感谢各位的阅读!

 

转载于:https://www.cnblogs.com/lori/p/6647229.html

你可能感兴趣的文章
黄聪: 50 个 Bootstrap 插件
查看>>
CSharpGL(17)重构CSharpGL
查看>>
C#日期格式精确到毫秒以及上下午
查看>>
EF Code First 学习笔记:表映射
查看>>
String深度解析
查看>>
Web jquery表格组件 JQGrid 的使用 - 全部代码
查看>>
Nginx日志定时切割脚本
查看>>
Python|PyCharm安装scrapy包
查看>>
Asp.Net customErrors与httpErrors的区别
查看>>
Gitlab环境快速部署(RPM包方式安装)
查看>>
intent详解(一)
查看>>
启动ip转法功能
查看>>
windows 访问 ubuntu虚拟机 django服务器 失败
查看>>
linux设备模型_转
查看>>
洛谷P2055 [ZJOI2009]假期的宿舍 [二分图最大匹配]
查看>>
【转】在MAC下使用ISO制作Linux的安装USB盘
查看>>
JVM内存模型
查看>>
angularjs 中的scope继承关系——(1)
查看>>
VMware如何实现和主机共享网络上网
查看>>
Linux日志分析ELK环境搭建
查看>>