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 ...
随机推荐
- Spring Boot - how to configure port
https://stackoverflow.com/questions/21083170/spring-boot-how-to-configure-port
- POJ 3255_Roadblocks
题意: 无向图,求单源次短路,每条边可以走多次. 分析: 对于每个点记录最短路和次短路,次短路可以是由最短路+边或者是次短路+边更新而来.在更新每个点的最短路时,相应更新次短路,如果最短路更新了,就令 ...
- 2017-10-01-afternoon
T1 一道图论好题(graph) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带 ...
- Java内存分配与参数传递
JAVA中方法的参数传递方式只有一种:值传递. JAVA内存分配: 1.栈:存放 基本类型的数据.对象的引用(类似于C语言中的指针) 2.堆:存放用new产生的数据 3.静态域:存放在对象中用stat ...
- C#代码读写XML
<1> 创建XML文档 using System; using System.Collections.Generic; using System.Linq; using System.Te ...
- Swift—使用try?和try!区别-仅供参考
在使用try进行错误处理的时候,经常会看到try后面跟有问号(?)或感叹号(!),他们有什么区别呢? 1.使用try? try?会将错误转换为可选值,当调用try?+函数或方法语句时候,如果函数或方 ...
- linux c 获取当前执行进程总数
获取当前执行进程总数的命令为: ps auxw | wc -l 获取当前执行进程总数的源代码例如以下: #include <stdio.h> #include <stdlib.h&g ...
- JSON-JSON字符串转换成JSON对象、JSON对象数组、java实体类以及保存到List列表中
处理JSON字符串时,一直出错,写个样例后发现原来是没有弄清楚数据的格式问题. 实现的是 JSONString 转换成java对象 或是 list列表 实例类 News package lyx.ent ...
- POJ1469 COURSES 【二分图最大匹配·HK算法】
COURSES Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 17777 Accepted: 7007 Descript ...
- PH_Pooled Featrues Classification MIREX 2011 Submission
Abstract Principal Mel-Spectrum Components (Feature) Temporal Pooling Functions (Model) Single Hidde ...