回到目录

在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动态模块化的设计的更多相关文章

  1. Lind.DDD.ExpressionExtensions动态构建表达式树,实现对数据集的权限控制

    回到目录 Lind.DDD框架里提出了对数据集的控制,某些权限的用户为某些表添加某些数据集的权限,具体实现是在一张表中存储用户ID,表名,检索字段,检索值和检索操作符,然后用户登陆后,通过自己权限来构 ...

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

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

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

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

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

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

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

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

  6. Lind.DDD.Plugins~插件模式的集成

    回到目录 对于Lind.DDD这个敏捷框架来说,插件也是其中的一个亮点,所有被认为是插件(Plugins)的模块都会继承自IPlugins这个标示接口,它在程序启动时会找到所有插件,并通过autofa ...

  7. Lind.DDD.Domain.ISortBehavor~上移与下移

    在进行列表排序时,有个“上移”和“下移”操作,这个一般在内存里完成,然后统一提交到数据库中,对于上移与下移的设计,大叔在LIND.DDD.DOMAIN里有一个ISortBehavor接口,主要是说,如 ...

  8. Lind.DDD.Repositories.EF层介绍

    回到目录 Lind.DDD.Repositories.EF以下简称Repositories.EF,之所以把它从Lind.DDD中拿出来,完全出于可插拔的考虑,让大家都能休会到IoC的魅力,用到哪种方法 ...

  9. Lind.DDD.Repositories.Mongo层介绍

    回到目录 之前已经发生了 大叔之前讲过被仓储化了的Mongodb,而在大叔开发了Lind.DDD之后,决定把这个东西再搬到本框架的仓储层来,这也是大势所趋的,毕竟mongodb是最像关系数据库的NoS ...

随机推荐

  1. 51nod 1126 求递推序列的第N项 && hdu - 1005 Number Sequence (求周期)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1126 http://acm.hdu.edu.cn/showproblem ...

  2. poj-1979 && hdoj - 1312 Red and Black (简单dfs)

    http://poj.org/problem?id=1979 基础搜索. #include <iostream> #include <cstdio> #include < ...

  3. JVM 总结

    面试 java 虚拟机 jvm 基础 jvm Write Once Run EveryWhere >jar 包可以在任何兼容jvm上运行 >jvm 适配器 屏蔽掉底层差异 >内存管理 ...

  4. Bootstrap官网文档查询

    Ctrl+F 在出现的小搜索框里面输入要查找的东西.回车即可!

  5. 逆袭指数-——杭电校赛(dfs)

    逆袭指数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  6. easyui datagrid-detailview 嵌套高度自适应

    实现效果 原因 异步加载,明细展开时,可能会遇到父列表不能自动适应子列表高度的变化 具体代码 $('#centerdatagrid').datagrid({ url:'${ctx}/offer/off ...

  7. neutron dhcp

    neutron dhcp 采用dnsmasq服务来实现.和传统的 dhcp 一样, dhcp请求也分为4步 The client sends a discover ("I'm a clien ...

  8. Ubuntu14.04 忘记rootpassword的解决方法

    对于windows操作系统,假设忘记管理员password,事实上还是蛮好解决的. 最简单的一种方式就是使用PE--电脑店,老毛桃等等,都能够非常完美的解决问题. 假设是Linux操作系统的话.事实上 ...

  9. redis 主从 及集群

    一.redis 主从架构 搭建redis 主从   (可以用一台主机,也可以两台主机) 环境准备: 一台服务器:192.168.206.6 操作系统:CentOS7.5 redis 版本: redis ...

  10. PHP中的extract函数的用途 extract($_GET);extract($_POST)

    把客户端表单中的变量名取出来 addslashes -- 使用反斜线引用字符串 extract(addslashes($_POST)); --处理POST表单 把客户端<FORM METHOD= ...