IoC 依赖注入容器 Unity

原文: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:

  1. 使用工厂模式 FactoryPattern
  2. 使用 ServiceLocator 模式
  3. 使用依赖注入 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>();

原文地址:https://www.cnblogs.com/lonelyxmas/p/10674439.html

时间: 2024-12-13 18:47:13

IoC 依赖注入容器 Unity的相关文章

Unity轻量级依赖注入容器

一.前言 Unity是一个轻量级的可扩展的依赖注入容器,支持构造函数,属性和方法调用注入.在Nuget里安装unity 二.Unity的API方法 UnityContainer.RegisterType<ITFrom,TTO>();  //注册映射 UnityContainer.RegisterType< ITFrom, TTO >("keyName");//注册映射指定key值 IEnumerable<T> databases = UnityCon

WPF PRISM开发入门二(Unity依赖注入容器使用)

这篇博客将通过一个控制台程序简单了解下PRISM下Unity依赖注入容器的使用.我已经创建了一个例子,通过一个控制台程序进行加减乘除运算,项目当中将输入输出等都用接口封装后,结构如下: 当前代码可以点击这里下载. 运行效果如下: 下面将引入Unity类库,使用Unity来生成需要的对象实例. 先查看一下CalculateRelpLoop类, public class CalculateRelpLoop : ICalculateRelpLoop { ICalculateService _calcu

IoC 依赖注入、以及在Spring中的实现

资源来自网络: 去年火得不行的Spring框架,一般的书籍都会从IoC和AOP开始介绍起,这个IoC概念,个人感觉资料里都写得让人看得有些痛苦,所谓IoC,就是控制反转(Inversion of Control)的缩写,这个大家都知道,但是个人觉得理解这个概念,最好应该从依赖(dependence)开始讲起,以下观点由此展开: UML中依赖关系如A依赖于B,就是A中有对方的引用;也就是说依赖就是引用:A依赖于B,就是A使用B来做事情. 所谓依赖,举个例子说明,一个类Person,另一个类Car,

依赖注入容器-Autofac

介绍一款依赖注入的容器AutoFac,一直非常迷惑依赖注入到底有独特的优势或者好处,感觉如果用策略模式和反射等也是可以实现这个解耦的,不管怎么样还是先来大概了解依赖注入到底是怎么一回事.              首先来看个例子,如果你想要一把锤子你会怎么做?(这个例子是我百度上看到的,觉得挺形象的) 1.自己造,打铁,锻造等. 2.或者你找制造锤子的工厂订购 3.打开淘宝,下单,支付 上面的例子在程序开发中分别有什么不同:第一种方式显而易见非常麻烦,从开发角度看就是高度耦合,导致使用和制造混在

php的依赖注入容器

这里接着上一篇 php依赖注入,直接贴出完整代码如下: <?php class C { public function doSomething() { echo __METHOD__, '我是C类|'; } } class B { private $c; public function __construct(C $c) { $this->c = $c; } public function doSomething() { $this->c->doSomething(); echo

Spring-DI控制反转和IOC依赖注入

Spring-DI控制反转和IOC依赖注入 DI控制反转实例 IDEAJ自动导入Spring框架 创建UserDao.java接口 public interface UserDao { public void say(); } 创建UserDaoImpl.java继承UserDao.java并重写say()方法 public class UserDaoImpl implements UserDao{ @Override public void say() { System.out.println

Spring IoC 依赖注入(二)源码分析

目录 Spring IoC 依赖注入(二)源码分析 1. 依赖注入口 - populateBean 1.1 doCreateBean 1.2 populateBean 2. 手动注入 2.1 相关的类说明 2.2 applyPropertyValues 2.3 BeanDefinitionValueResolver 2.4 依赖检查 2. 自动注入 2.1 那些字段会自动注入 2.2 名称注入 2.3 类型注入 Spring IoC 依赖注入(二)源码分析 本章主要分析 Spring IoC 依

如何编写一个简单的依赖注入容器

随着大规模的项目越来越多,许多项目都引入了依赖注入框架,其中最流行的有Castle Windsor, Autofac和Unity Container. 微软在最新版的Asp.Net Core中自带了依赖注入的功能,有兴趣可以查看这里. 关于什么是依赖注入容器网上已经有很多的文章介绍,这里我将重点讲述如何实现一个自己的容器,可以帮助你理解依赖注入的原理. 容器的构想 在编写容器之前,应该先想好这个容器如何使用. 容器允许注册服务和实现类型,允许从服务类型得出服务的实例,它的使用代码应该像 var

YII框架的依赖注入容器

依赖注入(Dependency Injection,DI)容器就是一个对象,它知道怎样初始化并配置对象及其依赖的所有对象. 所谓的依赖就是,一个对象,要使用另外一个对象才能完成某些功能.那么这个对象就依赖于被使用的对象. 例如: /** * 厨师 */ class cook { /** * 制作食物 */ public function cooking() { $food = new food(); echo $food->get(),"汤<br/>"; } } /*