开发者社区> 嗯哼9925> 正文

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>();










版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云ECI如何6秒扩容3000容器实例?
2021年云栖大会现场,阿里云工程师演示了在6秒时间内成功启动3000个ECI,并全部进入到Running状态。本文将为你揭开阿里云ECI是如何做到极速扩容的。
324 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
18663 0
Spring IOC 容器源码分析 - 循环依赖的解决办法
1. 简介 本文,我们来看一下 Spring 是如何解决循环依赖问题的。在本篇文章中,我会首先向大家介绍一下什么是循环依赖。然后,进入源码分析阶段。为了更好的说明 Spring 解决循环依赖的办法,我将会从获取 bean 的方法getBean(String)开始,把整个调用过程梳理一遍。
1312 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
23674 0
SOCK: Serverless场景的runc容器启动优化方案
> [原文链接 SOCK: Rapid Task Provisioning with Serverless-Optimized Containers](https://www.usenix.org/system/files/conference/atc18/atc18-oakes.pdf) > 译者 据德 ### 一. 摘要 Serverless计算平台能够为用户降低生产成本以及
1571 0
Riddler助力Docker容器为runC运行环境做准备
本文讲的是Riddler助力Docker容器为runC运行环境做准备【编者的话】本文主要是介绍Riddler工具,讲解Riddler为开发者带来的便利,并对基本使用进行了介绍和解释。
1172 0
+关注
4716
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载