回到目录

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

感谢各位的阅读!

回到目录

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

Lind.DDD.DynamicModules动态模块化的设计相关推荐

  1. Lind.DDD敏捷领域驱动框架~介绍

    最近觉得自己的框架过于复杂,在实现开发使用中有些不爽,自己的朋友们也经常和我说,框架太麻烦了,要引用的类库太多:之前架构之所以这样设计,完全出于对职责分离和代码附复用的考虑,主要参考了微软的DDD大作 ...

  2. Lind.DDD.Aspects通过Plugins实现方法的动态拦截~Lind里的AOP

    .Net MVC之所以发展的如些之好,一个很重要原因就是它公开了一组AOP的过滤器,即使用这些过滤器可以方便的拦截controller里的action,并注入我们自己的代码逻辑,向全局的异常记录,用户 ...

  3. Lind.DDD.Manager里菜单权限的设计

    对于一个后台管理系统来说,你的权限设计与安全是重中之重,当你为一个权限分配一些菜单后,当这个权限的用户没有菜单权限时,这个菜单的URL是不可以被用户访问的,而在之前的设计中,没有考虑到这点,所以本次L ...

  4. Lind.DDD.LindAspects方法拦截的介绍

    回到目录 什么是LindAspects 之前写了关于Aspects的文章<Lind.DDD.Aspects通过Plugins实现方法的动态拦截~Lind里的AOP>,今天主要在设计思想上进 ...

  5. 当中台遇上DDD,我们该如何设计微服务?

    微服务架构有哪些模型?中台.领域驱动设计及微服务之间有着什么样的关系?微服务的边界设计怎么做?怎么做设计和拆分?且看作者为你娓娓道来. 借用当下最流行的段子做个开场白. "设计原则千万条,高 ...

  6. Lind.DDD.Manager里的3,7,15,31,63,127,255,511,1023,2047

    回到目录 进制 我是一个程序猿,我喜欢简单的数字,十进制如何,数字太多,有10种数字组成,但由于它广为人知,所有使用最为广泛,人们的惯性思维培养了十进制,并说它是最容易被计算的数字,事实上,在计算机里 ...

  7. 墙外干货:如何通过风格指南驱动模块化交互设计

    使用风格指南驱动开发是一个可在前端开发中获得大量牵引力的实践--这背后的原因也是极有道理的.开发人员将在风格指南中加入新的代码或更新现有的代码,从而有助于稍后集成到程序中的模块化的用户界面系统.但是为 ...

  8. Lind.DDD.Manage项目核心技术分享

    回到目录 关于Lind.DDD.Manager的培训与学习 讲解:张占岭 花名:仓储大叔 主要框架:Lind.DDD,Lind.DDD.Manager 关于Lind.DDD.Manager 由于数据模 ...

  9. Lind.DDD.Caching分布式数据集缓存介绍

    戏说当年 大叔原创的分布式数据集缓存在之前的企业级框架里介绍过,大家可以关注<我心中的核心组件(可插拔的AOP)~第二回 缓存拦截器>,而今天主要对Lind.DDD.Caching进行更全 ...

最新文章

  1. 硬件重要还是软件重要?一个人能同时学会吗?
  2. pandas中的reset_index()
  3. 了解一下ES6: 函数简述深浅拷贝
  4. jenkins配置以cygwin环境的子节点
  5. 二叉树C++ | 查找节点(中序搜索)_5
  6. Linux内存管理:内存描述之高端内存
  7. vue.js把mounted里面的变量传到data里面
  8. 4.微服务:从设计到部署 --- 服务发现
  9. Linux3.2.8系统启动过程及启动延时初步分析
  10. 既有e^x又有sinx或cosx的积分题的解法
  11. 格林威克GEWK:skf轴承的清洁,维护和损坏的判断标准
  12. 1212:LETTERS
  13. JSONObject 与 JSON 互转
  14. 【luoguP1922】女仆咖啡厅桌游吧
  15. iOS 实现UIButton加小红点
  16. 7 款基于 HTML5 Canvas 的超炫 3D 动画效果
  17. week3 摄像头捕获人脸 AI换脸
  18. word合并文档php,使用PHPWord合并Word文档,在文档指定页插入另一个文档的内容
  19. 我的世界无限法则服务器推荐,我的世界无限法则怎么玩
  20. docx行间距怎么设置_word全文行距怎么设置

热门文章

  1. Java数据结构和算法:数组、单链表、双链表
  2. Java数据结构与算法:排序算法
  3. PyCharm2017软件安装教程
  4. python实验指导书2018_python实验指导书
  5. java求数列的最大子段和_天下无双的公考必考题 数量关系: 最值问题②(构造数列)...
  6. WEB中get请求和post请求的区别
  7. 安装系统要求错误_【船机帮】康明斯船用柴油机燃油系统的安装要求
  8. stp协议c语言,STP(生成树协议)
  9. Docker的镜像使用
  10. Spark详解(十四):Spark SQL的Join实现