【发布时间】:2011-08-12 23:22:12
【问题描述】:
我正在使用 DI 和 IoC 开发可扩展框架。用户必须能够通过将自己的实现放入容器中来覆盖框架内的现有功能。
我怎样才能允许用户在不知道我正在使用哪个 IoC 容器的情况下执行此操作?
我目前的中途解决方案是按如下方式构建我的程序集:
1) 定义只包含接口的抽象程序集。
2) 定义实现这些接口的具体程序集。用户可以定义自己的来覆盖现有的功能。
3) 在单独的程序集中定义容器绑定;即每个混凝土组件一个绑定组件。
这意味着具体组件不与特定的 IoC 容器耦合,如果我使用不同的容器,它们将被关闭以防止更改。但是,用户仍然需要知道我的框架正在使用哪个容器来编写绑定程序集,如果我更改了 IoC 容器(即从 Ninject 到 Spring),他们将需要发布新的绑定程序集。
我错过了什么吗?
【问题讨论】:
-
这种方法的问题是你受限于容器可以支持的最小公分母,在很多情况下这不能满足你的内部需求。我已经尝试过这种确切的方法,但它会给刚接触该项目的用户带来太多的困惑。
-
你用什么代替?
-
该框架提供了一组显式的注册点,并在没有容器的情况下管理内部依赖项。注册点包括工厂方法(通常基于 Func
)。然后容器扩展(在单独的程序集中)可以注册并为容器提供工厂方法。用于注册的中间模型也可用于将元数据从容器传输到框架。
标签: c# dependency-injection ioc-container ninject dependency-management