Lind.DDD.IoC(大叔推荐)~在服务定位器中引入IoC容器~容器的适配器
关于依赖倒置(DIP)
高层模块不依赖于低层模块的实现,而低层模块依赖于高层模块定义的接口,通俗的讲,就是高层模块定义接口,低层模块负责实现,这在我们实际开发中经常被用到,层与层之间引用,经常被添加一个接口层去隔离,在接口层定义相关业务规范,而底层去实现它,高层只引用这个接口,当高级需要其它扩展,直接添加新的接口,由新的底层模块去实现即可,底层其它代码不需要修改,这也完全复合开闭原则(OCP).
关于控制反转(IOC)
控制反转是一种设计模式,像单例,工厂,适合器都属于设计模式的一种,它是依赖倒置原则的具体实现,它告诉我们应该如何做,来解除相互依赖模块的耦合.
关于依赖注入(DI)
是IOC的一种实现方式,我们经常说的构造方法注入,属性注入,接口注入,指的就是DI,而我们经过说的unity,autofac,castle指的是DI的框架,即我们的IOC容器!
关于Lind.DDD.IoC容器
对于Lind.DDD.IoC模块来说,主要实现的功能是IoC和AoP,它在整个框架中都起到了底层支持的作用,如你的仓储在生产时,需要用到IoC;你的业务模块根据一个规则实现了多种策略,在生产这个业务模块时,需要用到IoC容器,而这个IoC容器可以通过服务定位器很方便找到你的依赖关系,坦白的说,对于所有对象的生产,都离不开服务定位器.
关于服务定位器(ServiceLocator)
一个程序集依赖别一个程序集,我们的服务定位器将帮助我们在Bin目录查找对应的依赖关系,帮我们生产对象;Lind.DDD里的服务定位器依赖了Lind的IocContainer,而新的IOC容器如果希望被服务定位器使用,我们只要实现IocContainer即可,这对于程序的扩展性是有好处的,目前Lind.IoC只集成了unity和autofac两种IoC容器.
关于Lind框架的IContainer
对所有第三方IoC容器的抽象,它只实现了最一般的IoC方法,如注入,反转,是否被注入等,具体看一下代码
/// <summary>
/// IoC容器规范
/// 作者:仓储大叔
/// </summary>
public interface IContainer
{
/// <summary>
/// 反射成对象
/// </summary>
/// <typeparam name="TService">接口类型</typeparam>
/// <returns>具体类型</returns>
TService Resolve<TService>();
/// <summary>
/// 反射成对象
/// </summary>
/// <typeparam name="TService">接口类型</typeparam>
/// <returns>具体类型</returns>
object Resolve(Type type);
/// <summary>
/// 反射成对象
/// </summary>
/// <typeparam name="TService">接口类型</typeparam>
/// <param name="overridedArguments">参数</param>
/// <returns>具体类型</returns>
TService Resolve<TService>(object overridedArguments);
/// <summary>
/// 反射成对象
/// </summary>
/// <typeparam name="TService">接口类型</typeparam>
/// <param name="overridedArguments">参数</param>
/// <returns>具体类型</returns>
object Resolve(Type serviceType, object overridedArguments);
/// <summary>
/// 注册抽象类型与具体实现的类型
/// </summary>
/// <param name="from">接口类型</param>
/// <param name="to">具体类型</param>
void RegisterType(Type from, Type to);
/// <summary>
/// 类型是否被注册到IoC容器
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
bool IsRegistered(Type type);
}
关于适配器模式
对于多种IoC容器的统一,我们借用了适配器模式,新添加了适配器类去实现我们自己的IContainer接口,在实现时,事实上是对原来第三方容器的重写,这种模式虽然添加了额外的类对象,但实现了对现有功能的扩展.
aaarticlea/png;base64,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" alt="" />
关于框架级的工厂模式
工厂模式一般不去实现,在业务层直接使用ioc容器生产对象即可,你使用工厂模块,一般都会有对象的switch这种坏味道的块出现,但对于比较稳定的框架对象来说,使用工厂模式还是比较不错的选择,因为你的框架实现是比较固定的,所以可以使用switch来进行策略的控制,从而生产指定的对象,当然对于不满足条件的,我们也应该手动throw出来,告诉开发人员.
aaarticlea/png;base64,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" alt="" />
结束语
希望大家都去自己写C#的框架,而不是每次都依赖从java共享出来的框架,感觉味道怪怪的,难道C#程度员真的这么懒呀!
哈哈!
Lind.DDD.IoC(大叔推荐)~在服务定位器中引入IoC容器~容器的适配器的更多相关文章
- Istio(十一):向istio服务网格中引入虚拟机
目录 一.模块概览 二.系统环境 三.虚拟机负载 3.1 虚拟机负载 3.2 单网络架构 3.3 多网络架构 3.4 Istio 中如何表示虚拟机工作负载? 四.实战:向istio Mesh中引入虚拟 ...
- Lind.DDD敏捷领域驱动框架~介绍
回到占占推荐博客索引 最近觉得自己的框架过于复杂,在实现开发使用中有些不爽,自己的朋友们也经常和我说,框架太麻烦了,要引用的类库太多:之前架构之所以这样设计,完全出于对职责分离和代码附复用的考虑,主要 ...
- Lind.DDD.Plugins~插件模式的集成
回到目录 对于Lind.DDD这个敏捷框架来说,插件也是其中的一个亮点,所有被认为是插件(Plugins)的模块都会继承自IPlugins这个标示接口,它在程序启动时会找到所有插件,并通过autofa ...
- Lind.DDD.Manage项目核心技术分享
回到目录 关于Lind.DDD.Manager的培训与学习 讲解:张占岭 花名:仓储大叔 主要框架:Lind.DDD,Lind.DDD.Manager 关于Lind.DDD.Manager 由于数据模 ...
- YII框架的依赖注入容器与服务定位器简述
依赖注入容器 依赖注入(Dependency Injection,DI)容器就是一个对象use yii\di\Container,它知道怎样初始化并配置对象及其依赖的所有对象. 依赖注入和服务定位器都 ...
- spring服务定位器类
此文章是基于 搭建SpringMVC+Spring+Hibernate平台 功能:通过持有的Spring应用场景ApplicationContext,可在任何地方获取bean. 1. 服务定位器类:S ...
- Lind.DDD.IoC依赖注入与面向方面的实现
回到目录 IoC是解耦的灵魂,很难想像一个框架中没有IoC会变成什么样子,Lind.DDD里的IoC是通过Unity实现的,由依赖注入(unity)和方法拦截组成(Interception),依赖注入 ...
- Lind.DDD.Repositories.EF层介绍
回到目录 Lind.DDD.Repositories.EF以下简称Repositories.EF,之所以把它从Lind.DDD中拿出来,完全出于可插拔的考虑,让大家都能休会到IoC的魅力,用到哪种方法 ...
- Lind.DDD.Events领域事件介绍
回到目录 闲话多说 领域事件大叔感觉是最不好讲的一篇文章,所以拖欠了很久,但最终还是在2015年年前(阴历)把这个知识点讲一下,事件这个东西早在C#1.0时代就有了,那时学起来也是一个费劲,什么是委托 ...
随机推荐
- 在JavaScript中,利用三元运算符生成当前日期yyyy-MM-dd
<script type="text/javascript"> //得到当前时间yyyy-MM-dd var myDate = new Date(); var nowD ...
- spring定时任务之quartz
在Spring中,使用JDK的Timer类库来做任务调度功能不是很方便,关键它不可以象cron服务那样可以指定具体年.月.日.时和分的时间.你只能将时间通过换算成微秒后传给它.如任务是每天执行一次,则 ...
- SSISDB1:使用SSISDB管理SSIS Projects
使用Project Deployment Model,将SSIS Project部署到Integration Services Catalog之后,SSISDB负责管理SSIS Project.在SS ...
- lua中的string类型
在lua中用union TString来表示字符串类型 lobject.h: 其中结构体tsv中 reserved字段表示字符串是不是保留关键字,hash是其哈希值,len是其长度.我们在TStrin ...
- android的logcat详细用法
Android日志系统提供了记录和查看系统调试信息的功能.日志都是从各种软件和一些系统的缓冲区中记录下来的,缓冲区可以通过 logcat 命 令来查看和使用. 使用logcat命令 你可以用 logc ...
- WPF做验证码,小部分修改原作者内容
原文地址:http://www.cnblogs.com/tianguook/p/4142346.html 首先感谢aparche大牛的帖子,因为过两天可能要做个登录的页面,因此,需要用到验证码,从而看 ...
- 简单生成svg文件
this.fileSaveSync = function (file, data) { var fs = require('fs-extra'); fs.writeFileSync(file, dat ...
- 解决Select2控件不能在jQuery UI Dialog中不能搜索的bug
本文使用博客园Markdown编辑器进行编辑 1.问题呈现 项目中使用了jQuery UI的Dialog控件,一般用来处理需要提示用户输入或操作的简单页面.逻辑是修改一个广告的图片和标题. 效果截图如 ...
- scikit-learn 支持向量机算法库使用小结
之前通过一个系列对支持向量机(以下简称SVM)算法的原理做了一个总结,本文从实践的角度对scikit-learn SVM算法库的使用做一个小结.scikit-learn SVM算法库封装了libsvm ...
- 窥探Swift之字符串(String)
之前总结过Objective-C中的字符串<Objective-C精选字符串处理方法>,学习一门新语言怎么能少的了字符串呢.Swift中的String和Objective-C语言中NSSt ...