繁体   English   中英

Unity 依赖注入

[英]Unity Dependency Injection

我一直在阅读有关 Unity 和依赖项注入的以下指南: https : //msdn.microsoft.com/en-us/library/dn178463(v=pandp.30).aspx

我遇到了一些让我困惑的事情:

使用 Unity 容器,您可以注册一组映射,以确定当构造函数(或属性或方法)标识要由接口类型或基类类型注入的类型时,您需要什么具体类型。 提醒一下,这里是 ManagementController 类中构造函数的副本,表明它需要注入一个实现 ITenantStore 接口的对象。

 public ManagementController(ITenantStore tenantStore) { this.tenantStore = tenantStore; }

以下代码示例展示了如何创建新的 Unity 容器,然后注册具体类型以在 ManagementController 实例需要 ITenantStore 实例时使用。

 var container = new UnityContainer(); container.RegisterType<ITenantStore, TenantStore>();

此处显示的 RegisterType 方法告诉容器在实例化需要通过构造函数、方法或属性注入 ITenantStore 实例的对象时实例化 TenantStore 对象。

最后:

var controller = container.Resolve<ManagementController>();

要实例化 ManagementController 和 TenantStore 对象,您必须调用 Resolve 方法。

这是他们举的一个例子。 然而,不久之后,他们又给出了另一个似乎与这个完全不同的例子。

container.RegisterType<ISurveyStore, SurveyStore>();

在这里,注册类型方法告诉容器在实例化一个需要通过构造函数、方法或属性注入 ISurveyStore 实例的对象时实例化一个 SurveyStore 对象。

让我困惑的是 Resolve() 方法:

var surveyStore = container.Resolve<ISurveyStore>();

在第一个示例中,解析意味着将实例化一个对象(ManagementController 类),并将实现 ITenantStore 接口的 TentantStore 实例传递给 ManagementController。 然而,在这里,不是具体的类被“解析”,而是 ISurveyStore 被解析。 这是什么意思? 一个ISurveyStore 实例不能实例化,因为它是一个接口,那么具体传入的SurveyStore 对象是什么? 这看起来是某种错误吗? 这两个示例在 RegisterType() 和 Resolve() 方面看起来很相似,但是在第二个示例中正在解决的实际问题似乎完全不同,并且与第一个示例进行比较时没有任何意义。

这个例子不是错误。 Resolve方法通常用于解析在容器中注册的实例。 因此,第一个示例实际上是以下内容的缩短版本(利用了 Unity 的某些功能):

container.RegisterType<ISurveyStore, SurveyStore>();
container.RegisterType<ManagementController, ManagementController>();

container.Resolve<ManagementController>();

所以这里我们注册了两种类型,分别是ServeyStoreManagementController ServeyStore映射到IServeStore接口,而ManagementController映射到自身。 这意味着,如果您要求ManagementController ,您将获得ManagementController

所以通常你注册你想让容器为你创建的所有东西,依赖注入背后的想法是你只解析根类型,让容器为你构建完整的底层对象图。

然而,Unity 允许解析具体类型,即使它们未注册。 无论如何注册这些类型通常是个好主意,但这是一个不同的讨论。 因此,该示例展示了 Unity 的几个不同方面:在类型之间进行映射的可能性以及解析具体类的可能性,即使它们可能尚未注册。

ManagementController不同,unity 能够解析ISurveyStory的唯一方法是当它真正知道如何将其映射到具体类型时,因为显然它无法创建接口。

您很好地说明了第一个示例中发生的情况:

在第一个示例中,解析意味着将实例化一个对象(ManagementController 类),并将实现 ITenantStore 接口的 TentantStore 实例传递给 ManagementController。

如果您正在解析接口类型,则第二个示例中的唯一区别。 但是 Unity知道如何解决它,因为您明确告诉它如何解决。 它会返回一个ISurveyStore类型,底层对象将是SurveyStore ,就像你已经做了一样:

ISurveyStore store = new SurveyStore();

传入的具体 SurveyStore 对象是什么?

你是直接解决它,它没有被传递给任何东西。 Unity 很聪明,你可以解析嵌套类型无论多深(只要​​它知道如何)。 在这里,您只是碰巧直接请求一个没有依赖关系的类型。 以同样的方式,给出第一个例子,你可以这样做:

var tenantStore = container.Resolve<ITenantStore>();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM