使用Unity Application Block(三):理解和使用依赖注入的键

在使用 Unity 创建对象之前,需要准备 Unity 容器,也即进行注册(类型映射)。在 使用Unity(二):配置 Unity 、读取配置信息和获取对象中, 我们学习了如何使用配置文件来进行注册,而在本文中,我们将学习使用代码来进行各种注册,这些代码所实现的功能同样可以使用配置文件来实现。

因为 Unity 自带的文档已在这方面进行了详细说明,所以在此仅对该文档进行了翻译,以下是译文。

Unity 应用程序块容器用键以及可选的名称来标识注册(类型映射)。键是接口一个接口或者一个类(通常是基类)的类型名称,它决定了实现或继承的具体对象的类型。此键标识了映射,所以容器可以在对 Get 或者 GetAll 的调用的响应中获取具体的对象类型。在有多个针对同一类型的地方,可选的名称用以区分这些映射,并允许代码指定将使用类型的哪个映射。

本主题的下列章节描述了可以如何使用依赖注入的键:

用接口的类型做为依赖键

用对象类型名称做为依赖键

组合依赖键和注册名

用于单件对象的依赖键

用于已有对象和 BuildUp 方法的依赖键

通过依赖键获得所有注册类型的列表

用接口类型做为依赖键

做为使用接受接口类型名称的 Register 和 Get 方法的重载的示例,下列代码注册了一个用于 IMyObject 接口的映射,并指定容器将返回 MyRealObject 类的实例(它实现了 IMyObject 接口)。在这种情况下,注册键是 IMyObject。随后使用键 IMyObject 请求实例的代码将接收到一个 MyRealObject 类的实例。此示例使用了容器方法的泛型重载。

IUnityContainer myContainer = new UnityContainer();
myContainer.Register<IMyObject, MyRealObject>();
IMyObject myRealObjectInstance = myContainer.Get<IMyObject>();

另一种方法就是,可以使用未泛型的方法重载。下列代码将得到同样的结果。

IUnityContainer myContainer = new UnityContainer();
myContainer.Register(typeof(IMyObject), typeof(MyRealObject));
IMyObject myRealObjectInstance = myContainer.Get(typeof(IMyObject));

注意:前面的二个 Unity 容器的泛型和非泛型重载确保 Unity 应用程序块可以在不支持泛型的语言中使用。可以在代码中使用任意一种方法(泛型和非泛型的重载),以及根据需要混合使用它们。例如,可以使用泛型重载注册映射,然后使用非泛型重载获取对象实例,返过来也是一样的。

时间: 2024-10-27 11:07:14

使用Unity Application Block(三):理解和使用依赖注入的键的相关文章

Unity Application Block 1.0系列(1):快速开始

Unity Application Block (Unity) 是微软 Patterns & Practices 团队开发的一个轻量级.可扩展的依赖注入容器,有助于构建松散耦合的系统.它支持构造子注入 (Constructor Injection) , 属性/设值方法注入 (Property/Setter Injection) 和方法调用注入 (Method Call Injection) .Patterns & Practices 团队于前些天(4月4日)发布了Unity的第一个正式版本

Unity Application Block 1.2 学习笔记

昨天花了一天时间,把IOC/DI的相关文章以及Unity相关的一些文章基本在园子里搜了个遍 先给出几篇不错的文章链接: Unity Application Block官方网址 http://www.codeplex.com/unity 吕震宇整理的[Object Builder Application Block] http://www.cnblogs.com/zhenyulu/articles/641728.html 吕震宇[你真的了解Ioc与AOP吗?] http://www.cnblogs

Unity Application Block 1.0系列(7):Lifetime Managers

Unity使用继承于 LifetimeManager 基类的类去控制怎样存放到对象实例的引用和容器怎样销毁这些实例,也就是说Unity基于具体的Lifetime Manager 类去管理对象的创建和销毁. 目前Unity中提供两个Lifetime Manager类可供我们直接使用,当然你也可以实现自己的Lifetime Manager类. 1. ContainerControlledLifetimeManager Unity保存一个指向对象实例的引用.通过Unity容器为同一个类型或对象获取对象

Unity Application Block 1.0系列(6):杜绝循环引用

在介绍 Constructor Injection.Property Injection和 Method Call Injection时,都有特别提到不要出现循环引用(Circular References),因为出现这种问题后很难去检测到.最好的解决方法是写代码时候尽量避免出现这种情况. 下面看看循环引用的几个场景,在使用依赖注入框架时应该尽量避免出现这样的情况: 1.通过Constructor Injection生成的对象在构造器的参数中互相引用 public class Class1{ p

Unity Application Block 1.0系列(5): 使用BuildUp让已存在对象实例也支持依

通过Unity容器的BuildUp方法可以让已存在的对象实例也可以支持依赖注入. 准备工作 先看一些类,下面会用到: public class Owner{ public string Name { get { return "Inrie"; } } public int Age { get { return 24; } }}public abstract class Player{ public abstract void Play(); public abstract string

Unity(六):使用场景Ⅲ:用于依赖注入(上)

有关依赖注入 什么是依赖注入,我想这个问题我在这里说就不大合适了,所以还是推荐一下大师的文章.之前的文章也提到过,"Martin Fowler的Inversion of Control Containers and the Dependency Injection pattern 是不得不推荐的,当然,如果读起来比较费劲的话,吕震宇的你真的了解Ioc与AOP吗?系列也是不错的参考". 这里要多说一句的是,依赖注入(Dependency Injection)和控制反转(Inversion

Unity(七):使用场景Ⅲ:用于依赖注入(下)

Fluent interface 上一篇文章我使用到了Fluent interface这个特性,但是这一点忘了交代了,不好意思...补上! 先来看段代码: 咋看上去,可能会有些不习惯,但是再仔细看,又会觉得表意很清楚,能够很顺畅的把这段代码阅读下来.这个特性叫做Fluent interface(我还不清楚中文统一的翻译是什么),具体可以参见Martin Fowler的http://martinfowler.com/bliki/FluentInterface.html一文,这个概念也是Martin

自定义Unity 容器的扩展 --- Unity Application Block Event Broker

Unity快速入门的例子中有一个Block Event Broker通过对容器功能的扩展来实现事件截获,其中扩展的代码在项目EventBrokerExtension.该项目允许在应用程序种使用自定义的容器扩展来发布和订阅事件. 自定义Unity 容器扩展是一个从 UnityContainerExtension 基类继承而来并且实现了一些额外的方法的自定义类型.该扩展可以访问容器,并且可以接收到容器中已经注册的事件. SimpleEventBrokerExtension 类继承 UnityCont

Unity Application Block 1.0系列(4):方法调用注入(Method Call Injection)

什么情况下使用Method CallInjection 当实例化父对象时也能自动实例化所依赖的对象 通过简单的方式使得很容易做到在代码中查看每个类所依赖的项 父对象有很多相互之间有关联关系的构造器,导致在调试和维护时很不方便 父对象包含有很多参数构造器,特别是参数类型相似的只能通过参数的位置来辨别的 隐藏依赖的对象,不作为属性暴露出去 通过修改依赖对象的代码来控制哪些对象可以被注入,而不用改动父对象或应用程序 准备工作 public interface IPlayer { void Play()