IoC 依赖注入容器 Unity
IoC 是什么?
在软件工程领域,“控制反转(Inversion of Control,缩写为IoC)”是一种编程技术,表述在面向对象编程中,可描述为在编译时静态分析器并不知道具体被耦合的对象,而该对象是在运行时被对象装配器绑定的。
在传统编程中,决定业务流程的对象是被静态分配的。而在 IoC 中,业务流程取决于对象装配器实例化提供的对象,这使利用抽象来定义对象间的交互成为可能。对象装配器为了能绑定一个对象,要求该对象必须具备兼容的抽象定义。例如类 ClassA 可以需要接口 InterfaceI 的功能,而 ClassB 实现了该接口,则装配器可实例化 ClassA 和 ClassB,并将 ClassB 的实例注入到 ClassA 的实例中。
在实践中,IoC 是一种利用可复用代码来控制特性需求代码的软件构建风格。它着重强调了在应用程序的开发中,可复用代码和特性需求代码可分别被独立地实现。
IoC 作为一种软件设计准则有以下用途:
- 将某项任务的执行从具体实现中解耦和。
- 各个模块可专注于其设计目的。
- 模块仅依赖于契约定义,不会对具体实现做出任何假设。
- 更换模块对其他模块没有任何副作用。
IoC 还时常被称为著名的 "好莱坞原则":
Hollywood Principle: Don't call us, we'll call you.
在好莱坞,当演员把简历递交给演艺公司之后,经常得到的答复是 "不要来找我们,需要时我们会找你的。",演员只能被动式的接受公司的差使,在需要的环节完成自己的演出。
IoC 实现技术
在面向对象编程中,有多种基本技术可实现 IoC:
- 使用工厂模式 FactoryPattern
- 使用 ServiceLocator 模式
- 使用依赖注入 DependencyInjection
IoC 是非常通用的技术术语,IoC的拥护者提倡使用更为特定的名称“依赖注入(Dependency Injection,缩写为 DI)”来描述。
IoC容器是什么?
IoC 容器是一种管理对象创建过程的简单方式。可以通过它来定义复杂对象的创建过程,使你可以通过几行代码即可获取到所需的对象。也可使用它来为类和方法注入(Inject)依赖项。
IoC 容器可以提高应用程序的灵活行和可测试行。通过在容器中注册接口实现的替代实现,或使用 Stub 和 Mock 等技术来隔离被测试代码的外部依赖。
Unity是什么?
Unity 是一个轻量级、可扩展的依赖注入容器(Dependency Injection Container),其支持截取、构造函数注入、属性注入和方法调用注入等。可以利用 Unity 通过多种方式进行应用程序组件间的解耦,从而最大化组件的一致性,并简化设计、实施、测试和管理等。
Unity 提供了所有常见的依赖注入机制,包括注册类型映射、注册对象实例、解决依赖、管理对象的生存期,为参数的构造函数和方法注入依赖对象,和解析对象的属性值。 此外,Unity 拥有很好的可扩展性。可以通过添加容器扩展来改变容器的行为或增加新的功能。例如在 Unity 中拦截功能,向被拦截对象添加各种策略即是通过容器扩展实现。
Unity的设计目标
- 通过促进模块化的设计原则来解除组件、业务对象和服务间的耦合;
- 提高在设计应用程序时最大化可测试性的意识;
- 提供用于创建和管理对象的快速轻量的依赖注入容器机制;
- 为开发者提供紧凑和直观的 API;
- 支持宽泛的编程语言特性,例如通过方法覆写来支持泛型参数;
- 为构造函数、属性和方法实现特性驱动的注入;
- 提供自定义和第三方的容器扩展机制;
- 满足企业级 LOB 应用程序中性能需求;
Unity可以做什么?
通过使用 DI 框架和 IoC 机制,可以生成或装配类和对象的实例,并且该实例可以包含所依赖的对象实例和设置。
- 创建指定类型的对象
- 注册现有类型或对象实例
- 管理对象的生存期
- 注入指定对象
- 填充或注入数组
- 拦截对对象的调用
Unity构造函数注入代码示例
如果使用 Unity 实例化一个类,该类的构造函数依赖一个或多个其他类,则 Unity 会为构造函数自动创建参数中指定的被依赖的类的实例。
例如,下面的代码展示了一个名为 "CustomerService" 的类,其构造函数的入参依赖于一个名为 "LoggingService" 的类。
public class CustomerService
{
public CustomerService(LoggingService log)
{
log.WriteToLog("I'm an injected concrete logging service.");
}
}
在运行时,可使用 Unity 容器的 Resolve 方法创建 "CustomerService" 类的实例,则一个 "LoggingService" 类的具体实现会被注入到 "CustomerService" 实例中。
IUnityContainer container = new UnityContainer();
CustomerService customer = container.Resolve<CustomerService>();
IoC 依赖注入容器 Unity的更多相关文章
- AutoFac Ioc依赖注入容器
本文原著:牛毅 原文路径 http://niuyi.github.io/blog/2012/04/06/autofac-by-unit-test/ 理解IOC容器请看下图: 没有使用IOC容器的情况 ...
- 关于微软企业库中依赖注入容器Unity两种生成对象的实现u
http://www.byywee.com/page/M0/S261/261037.html
- Asp.net core自定义依赖注入容器,替换自带容器
依赖注入 在asp.net core程序中,众所周知,依赖注入基本上贯穿了整个项目,以通用的结构来讲解,控制器层(Controller层)依赖业务层(Service层),业务层依赖于仓储层(Repos ...
- 控制反转、依赖注入、Unity容器
控制反转原则 依赖注入 Install-Package Unity:https://www.nuget.org/packages/Unity/ Github:https://github.com/un ...
- WPF PRISM开发入门二(Unity依赖注入容器使用)
这篇博客将通过一个控制台程序简单了解下PRISM下Unity依赖注入容器的使用.我已经创建了一个例子,通过一个控制台程序进行加减乘除运算,项目当中将输入输出等都用接口封装后,结构如下: 当前代码可以点 ...
- Unity轻量级依赖注入容器
一.前言 Unity是一个轻量级的可扩展的依赖注入容器,支持构造函数,属性和方法调用注入.在Nuget里安装unity
- 依赖注入之unity(winform方式)
依赖注入之unity(winform方式) 要讲unity就必须先了解DI和IOC及DIP,如下链接提供DI和IOC的基础:https://www.cnblogs.com/zlp520/p/12015 ...
- Autofac依赖注入容器
依赖注入容器-- Autofac https://github.com/danielpalme/IocPerformance Unity 更新频率高,微软的项目Grace 综合性能更高 目录: 一.简 ...
- Yii2.0 依赖注入(DI)和依赖注入容器的原理
依赖注入和依赖注入容器 为了降低代码耦合程度,提高项目的可维护性,Yii采用多许多当下最流行又相对成熟的设计模式,包括了依赖注入(Denpdency Injection, DI)和服务定位器(Serv ...
随机推荐
- mongodb常用基础命令
查看当前使用的数据库,也可以直接用dbdb.getName() 显示当前db状态db.stats() 当前db版本 db.version() 查看当前db的链接机器地址db.getMongo() 查看 ...
- POJ-2429 GCD & LCM Inverse---给出gcd和lcm求原来两个数
题目链接: https://cn.vjudge.net/problem/POJ-2429 题目大意: 给出两个数的gcd和lcm,求原来的这两个数(限定两数之和最小). 解题思路: 首先,知道gcd和 ...
- ADF中遍历VO中的行数据(Iterator)
在ADF中VO实质上就是一个迭代器, 1.在Application Module的实现类中,直接借助VO实现类和Row的实现类 TestVOImpl organizationUser = (TestV ...
- BZOJ2662:[BJWC2012]冻结(分层图最短路)
Description “我要成为魔法少女!” “那么,以灵魂为代价,你希望得到什么?” “我要将有关魔法和奇迹的一切,封印于卡片之中„„” 在这个愿望被实现以后的世界里,人们享 ...
- 「LG2664 树上游戏」
题目 这真是一道神仙的一批的题目 定义\(s(i,j)\)表示从点\(i\)到点\(j\)经过的颜色数量 设 \[sum_i=\sum_{j=1}^ns(i,j)\] 求出所有的\(sum_i\) 考 ...
- 掺合模式(Mixin)
Mixin是JavaScript中用的最普遍的模式,可以就任意一个对象的全部或部分属性拷贝到另一个对象上.从提供的接口来看,有的是对对象的操作,有的是对类的操作.对类的操作又称为掺元类(Mixin c ...
- C++备忘知识整理
一.设置字体颜色 C++控制台程序运行时输出框默认的文字颜色是白色,所以我常称其输出框为黑白框.但是这个文字样式不是固定不变的,是可以改变颜色的字体的.方法有两种: 1.设置输出框的框体属性.在运行时 ...
- 史上最简单的SpringCloud教程 | 第十篇: 高可用的服务注册中心(Finchley版本)
转载请标明出处: 原文首发于 https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f10-eureka/ 本文出自方志朋的博客 文章 史上最简单 ...
- python多线程知识-实用实例
python多线程使用场景:IO操作,不适合CPU密集操作型任务 1.多个线程内存共享 2.线程同时修改同一份数据需要加锁,mutex互斥锁 3.递归锁:多把锁,锁中有锁 4.python多线程, ...
- python drf+xadmin+react+dva+react-native+sentry+nginx 搭建前后端分离的博客完整平台
前言: 经过差不多半年的开发,搭建从前端到服务器,实现了前后端分离的一个集PC端.移动端的多端应用,实属不易,今天得空,好好写篇文章,记录这些天的成果.同时也做个分享. 演示网站地址: http:// ...