RSS

导航







快速搜索

高级搜索 »

注意:此页面是Unity 1.x 中文文档的一部分。

译:邓明

此场景探讨了可以如何使用 Resolve 方法从 Unity 容器中获取注册的对象的具体实例。

典型目标

在此场景中,仅使用对象的注册类型获取注册对象的默认(未命名的)实例、单件引用或者由容器管理的已存在对象的引用。

解决方案

要从容器中获取实例,可以使用 Resolve 方法。在没有为可选的名称属性指定值来使用此方法时,方法返回用默认映射注册的对象。

注意

在调用 Resolve 方法并且指定了没有注册的类型的默认实例时,容器简单的生成并返回类型的实例。然而,这仅在生成的对象包含依赖属性的时候才有用,容器用来注入依赖对象到请求的对象。

如果在调用 Resolve 方法或者指定了名称,也就是注册类型,而没有用于类型或名称的映射注册,容器将触发异常。

用默认映射从容器中获取对象

1.使用一个容器的引用,调用 Resolve 方法并指定需要的对象类型(在注册对象时指定的类型)。如果注册的是 IMyService 接口,映射到具体类型 EmailService,下列代码将获取 EmailService 的实例:

C#
IMyService result = myContainer.Resolve<IMyService>();

Visual Basic
Dim result As IMyService = myContainer.Resolve(Of IMyService)()

注意:用于 Unity 容器的 API 包含了绝大多数方法的泛型和非泛型的重载,所以可以在不支持泛型语法的语言中使用它。更多信息,请参见 Unity 应用程序块的方法

2.如果注册的是 MyServiceBase 类型的对象,映射到具体类 CustomerService,下列代码将获取 CustomerService 的实例:

C#
MyServiceBase result = myContainer.Resolve<MyServiceBase>();

Visual Basic
Dim result As MyServiceBase = myContainer.Resolve(Of MyServiceBase)()

3.如果知道返回的实质类型,也许可以考虑指定此做为返回类型,就像下列代码一样。然而,如果后来修改了容器中的映射,这将出现错误。

C#
CustomerService result = (CustomerService)myContainer.Resolve<MyServiceBase>();

Visual Basic
Dim result As CustomerService = myContainer.Resolve(Of MyServiceBase)()

注意:如果目标类或者对象指定了任何它拥有的依赖,使用构造函数、属性或者方法调用注入特性,返回的实例将拥有这些自动注入的依赖对象。关于使用构造函数、属性或者方法调用注入技术的信息,请参见 用于构造函数注入的注解对象( Annotating Objects )用于属性(设值器)注入的注解对象(Annotating Objects)用于方法调用注入的注解对象

更多信息

在这种场景中讨论的技术的更多信息,请参见以下主题:


顶部
.NET 藏经阁 | | 版权所有 ©2008 entlib.net.cn