我想将所有代码与我选择的IoC容器库(Unity)隔离开来。为此,我创建了一个公开Register()和Resolve()的IContainer接口。我创建了一个名为UnityContainerAdapter的类,它实现了IContainer并包装了真正的容器。因此,只有定义UnityContainerAdapter的程序集才能了解Unity库。
我的孤立思想漏掉了。 Unity会搜索类型成员的属性,以了解注入依赖项的位置。我见过的大多数IoC库也支持这一点。我遇到的问题是我想使用该功能,但我不希望我的类依赖于Unity特定属性。
您对如何解决此问题有任何建议吗?
理想情况下,我会创建自己的[Dependency]属性,并在我的代码中使用该属性。但我需要告诉真正的容器搜索我的属性而不是它自己的属性。
答案 0 :(得分:4)
Common Service Locator库 包含一个共享接口 申请和服务的位置 框架开发者可以参考。 该库提供了一个抽象 在IoC容器和服务上 定位器。使用库允许 申请间接访问 能力而不依赖于努力 引用。希望是使用 这个库,第三方应用程序 和框架可以开始利用 IoC /服务位置无需搭售 他们自己到特定的 实施
编辑:这似乎并不能解决您使用基于属性的依赖注入声明的愿望。您可以选择不使用它,也可以找到一种方法将属性抽象到多个注入库(如您所提到的)。
这是声明性接口的基本问题 - 它们与特定的实现相关联。
就个人而言,我坚持使用构造函数注入,所以我不会遇到这个问题。
答案 1 :(得分:3)
我找到了答案:Unity使用扩展来配置他们所谓的“选择器策略”。要替换Unity使用的属性,您只需编写自己的UnityDefaultStrategiesExtension类版本,并注册使用自己属性的“选择器策略”。
有关如何执行此操作的详细信息,请参阅Unity codeplex网站上的this post。
如果我切换到另一个IoC库但是现在解决了我的问题,我不确定这样做会很容易。
答案 2 :(得分:0)
难道你不能在xml中设置没有属性的配置。这让我更加“不清楚”,我知道,我个人使用xml和属性的组合,但至少它“解决”了你对统一事物的依赖。