如何避免与IoC容器耦合

Law*_*eld 6 c# dependency-injection ninject ioc-container dependency-management

我正在使用DI和IoC开发可扩展框架.用户必须能够通过将自己的实现放入容器中来覆盖框架内的现有功能.

如何让用户在不要求他们知道我正在使用哪个IoC容器的情况下执行此操作?

我目前的中途解决方案是按如下方式构建我的程序集:

1)定义仅包含接口的抽象程序集.

2)定义实现这些接口的具体组件.用户可以定义自己的内容以覆盖现有功能.

3)在单独的程序集中定义容器绑定; 即每个混凝土组件一个装订组件.

这意味着混凝土组件不与特定的IoC容器耦合,如果我使用不同的容器,它们将被关闭以防止更改.但是,用户仍然需要知道我的框架正在使用哪个容器来编写绑定程序集,如果我更改了IoC容器(即从Ninject到Spring),他们需要释放新的绑定程序集.

我错过了什么吗?

Mar*_*ann 9

编写松散耦合的代码.应用程序应该依赖于容器.框架不应该.


jer*_*enh 1

公共服务定位器是一种方法,但它只包含解析方法,而不包含注册方法。

您可能想看看这是如何在agatha-rrsl 项目中实现的。这里有更完整的解释,但简而言之:

  • 定义一个与容器无关的接口来注册和解析类型
  • 提供不同容器的实现(或让用户提交实现)

警告:您可能无法直接在库中使用您选择的容器。

  • 您编写了“用于注册和解析类型的与容器无关的接口”。在我看来,您会根据实例的类型从界面中提取实例。这就是服务位置的定义:http://blog.ploeh.dk/2010/11/01/PatternRecognitionAbstractFactoryOrServiceLocator.aspx (2认同)