4

我想将我的所有代码与我选择的 IoC 容器库(Unity)隔离开来。为此,我创建了一个公开 Register() 和 Resolve() 的 IContainer 接口。我创建了一个名为 UnityContainerAdapter 的类,它实现了 IContainer 并包装了真实的容器。所以只有定义了 UnityContainerAdapter 的程序集才知道 Unity 库。

我的孤立思想有漏洞。Unity 搜索类型成员的属性以了解在何处注入依赖项。我见过的大多数 IoC 库也支持这一点。我遇到的问题是我想使用该功能,但我不希望我的类依赖于 Unity 特定属性。

您对如何解决此问题有任何建议吗?

理想情况下,我会创建自己的 [Dependency] 属性并在我的代码中使用该属性。但是我需要告诉真正的容器搜索我的属性而不是它自己的属性。

4

3 回答 3

4

查看Common Service Locator项目:

Common Service Locator 库包含一个用于服务定位的共享接口,应用程序和框架开发人员可以引用该接口。该库提供了对 IoC 容器和服务定位器的抽象。使用该库允许应用程序在不依赖硬引用的情况下间接访问这些功能。希望使用这个库,第三方应用程序和框架可以开始利用 IoC/服务位置,而无需将自己束缚于特定的实现。


编辑:这似乎不能解决您使用基于属性的依赖注入声明的愿望。您可以选择不使用它,也可以找到一种方法将属性抽象到多个注入库(就像您提到的那样)。

这是声明式接口的基本问题——它们与特定的实现相关联。

就个人而言,我坚持构造函数注入,所以我不会遇到这个问题。

于 2009-06-29T16:50:47.907 回答
3

我找到了答案:Unity 使用扩展来配置他们所谓的“选择器策略”。要替换 Unity 使用的属性,您只需编写您自己版本的 UnityDefaultStrategiesExtension 类并注册您自己的使用您自己属性的“选择器策略”。

有关如何执行此操作的详细信息,请参阅Unity codeplex 站点上的这篇文章。

我不确定如果我切换到另一个 IoC 库是否会很容易做同样的事情,但这暂时解决了我的问题。

于 2009-07-03T17:12:41.253 回答
0

您不能在 xml 中设置没有属性的配置。我知道,这使得它更加“不清楚”,我个人使用 xml 和属性的组合,但至少它“解决”了您对统一事物的依赖。

于 2009-07-01T10:55:30.170 回答