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动态模块化的设计的更多相关文章
- Lind.DDD.ExpressionExtensions动态构建表达式树,实现对数据集的权限控制
回到目录 Lind.DDD框架里提出了对数据集的控制,某些权限的用户为某些表添加某些数据集的权限,具体实现是在一张表中存储用户ID,表名,检索字段,检索值和检索操作符,然后用户登陆后,通过自己权限来构 ...
- Lind.DDD敏捷领域驱动框架~介绍
回到占占推荐博客索引 最近觉得自己的框架过于复杂,在实现开发使用中有些不爽,自己的朋友们也经常和我说,框架太麻烦了,要引用的类库太多:之前架构之所以这样设计,完全出于对职责分离和代码附复用的考虑,主要 ...
- Lind.DDD.Aspects通过Plugins实现方法的动态拦截~Lind里的AOP
回到目录 .Net MVC之所以发展的如些之好,一个很重要原因就是它公开了一组AOP的过滤器,即使用这些过滤器可以方便的拦截controller里的action,并注入我们自己的代码逻辑,向全局的异常 ...
- Lind.DDD.Manager里菜单权限的设计
回到目录 对于一个后台管理系统来说,你的权限设计与安全是重中之重,当你为一个权限分配一些菜单后,当这个权限的用户没有菜单权限时,这个菜单的URL是不可以被用户访问的,而在之前的设计中,没有考虑到这点, ...
- Lind.DDD.LindAspects方法拦截的介绍
回到目录 什么是LindAspects 之前写了关于Aspects的文章<Lind.DDD.Aspects通过Plugins实现方法的动态拦截~Lind里的AOP>,今天主要在设计思想上进 ...
- Lind.DDD.Plugins~插件模式的集成
回到目录 对于Lind.DDD这个敏捷框架来说,插件也是其中的一个亮点,所有被认为是插件(Plugins)的模块都会继承自IPlugins这个标示接口,它在程序启动时会找到所有插件,并通过autofa ...
- Lind.DDD.Domain.ISortBehavor~上移与下移
在进行列表排序时,有个“上移”和“下移”操作,这个一般在内存里完成,然后统一提交到数据库中,对于上移与下移的设计,大叔在LIND.DDD.DOMAIN里有一个ISortBehavor接口,主要是说,如 ...
- Lind.DDD.Repositories.EF层介绍
回到目录 Lind.DDD.Repositories.EF以下简称Repositories.EF,之所以把它从Lind.DDD中拿出来,完全出于可插拔的考虑,让大家都能休会到IoC的魅力,用到哪种方法 ...
- Lind.DDD.Repositories.Mongo层介绍
回到目录 之前已经发生了 大叔之前讲过被仓储化了的Mongodb,而在大叔开发了Lind.DDD之后,决定把这个东西再搬到本框架的仓储层来,这也是大势所趋的,毕竟mongodb是最像关系数据库的NoS ...
随机推荐
- POJ 2431 Expedition【贪心】
题意: 卡车每走一个单元消耗一升汽油,中途有加油站,可以进行加油,问能否到达终点,求最少加油次数. 分析: 优先队列+贪心 代码: #include<iostream> #include& ...
- Delphi:Indy9的IdFTP完全使用
Delphi 7自带的INDY控件,其中包含了IdFTP,可以方便的实现FTP客户端程序,参考自带的例子,其中有上传.下载.删除文件,但是不包含对文件夹的操作,得自己实现上传.下载.删除整个文件夹(带 ...
- POJ——T 2728 Desert King
http://poj.org/problem?id=2728 Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 27191 ...
- Codeforces 22E(图论)
题意: 给出n个节点,以及和这个节点指向的节点fi,表示从i能够到达fi,问至少需要添加多少条边能够使得原图变为强连通分量, 输出边数及添加的边,多解输出任意一组解. 2 <= n <= ...
- Sql查询一个列对应多个列
Sql查询一个列对应多个列 今天遇到一个问题,表table1有两个字段col1.col2两个字段.先记录下来,以后有个参考. 现在需要查询出的数据满足如下要求: 1.col1重复.col2重复的数据只 ...
- Windows 10 S中的Device Guard详解(上篇)
本文探讨Windows 10 S(下称Win10S)中的Device Guard(设备保护,下称DG).我将提取策略,并弄清楚在默认Win10S系统上可以和不可以运行什么.我将在下一篇文章中介绍在不安 ...
- 使用HTML5监測站点性能
在这个信息爆炸的互联网时代,越来越多的人缺少了等待的耐心.站点性能对于一个站点来说越来越重要.下面为监控到的站点打开时间对跳出率的影响: 当站点打开时间在0-1秒时,跳出率为12% 当站点打开时间在1 ...
- Hadoop之——HBASE结合MapReduce批量导入数据
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46463889 废话不多说.直接上代码,你懂得 package hbase; imp ...
- PHP + Socket 发送http请求进而实现站点灌水
本质上实现组装http信息的请求行,头信息.主题信息.參考it自学网 cookie信息和http请求头有非常大关系,注意把http请求头信息传递到函数里面 01-msg.php <?php re ...
- 从编译器源代码中提取ARMv8的指令编码
2012年11月份的资料,之前ARMv8手冊还没公布,我想办法从编译器的binutils中提取出了全部ARMv8指令的二进制编码,之前不能随便发,如今相当于解禁了^_^. 问题1:提取ARMv8的指令 ...