如何隐藏真正的IoC容器库?

时间:2009-06-29 16:39:34

标签: unity-container ioc-container

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

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

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

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

3 个答案:

答案 0 :(得分:4)

查看Common Service Locator项目:

  

Common Service Locator库   包含一个共享接口   申请和服务的位置   框架开发者可以参考。   该库提供了一个抽象   在IoC容器和服务上   定位器。使用库允许   申请间接访问   能力而不依赖于努力   引用。希望是使用   这个库,第三方应用程序   和框架可以开始利用   IoC /服务位置无需搭售   他们自己到特定的   实施


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

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

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

答案 1 :(得分:3)

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

有关如何执行此操作的详细信息,请参阅Unity codeplex网站上的this post

如果我切换到另一个IoC库但是现在解决了我的问题,我不确定这样做会很容易。

答案 2 :(得分:0)

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