使用我的IOC容器的配置文件绑定覆盖代码内绑定

时间:2012-07-20 06:11:30

标签: c# dependency-injection inversion-of-control castle-windsor ninject

在我们正在开发的项目中,我们使用Castle Windsor作为IOC容器。此时我们在配置文件中指定所有依赖项以获得灵活性。

我们的配置文件有点大,为了使绑定更容易管理,我宁愿把它们放在代码中。当然,这意味着我失去了一点灵活性,可以轻松更改生产中的某些绑定。

我想知道是否可以让配置文件中的绑定覆盖代码中的绑定。这意味着我可以在代码中指定所有默认绑定,然后添加一个配置文件,如果我想在生产中更改绑定,则会有一些例外。

因为我正在使用温莎城堡,所以我很感兴趣,如果这可能在温莎城堡。但是,我们正在考虑转移到不同的IOC容器(例如NInject)。因此,如果另一个人可以做得更好,那么我也对这些信息感兴趣。

(PS:我也在研究自动绑定,因为我们的大多数接口都只用于单元测试目的,并且只有一个类使用相同的名称减去“I”来实现它。我甚至在考虑放置与实现相同的文件中的那些接口。)

提前致谢。

更新

我完全按照我想要的方式找到了a nice Ninject extension that will allow me to do automatic bindings。我还找到了a Ninject extension for doing XML bindings。但是,我无法找到这些XML绑定是否会在代码绑定中覆盖。

1 个答案:

答案 0 :(得分:1)

我认为你在代码中使用绑定后获得了灵活性,但它可能不是你想要的设计类型......

我将我的功能分解为模块(具有一个且只有一个实现IModule接口的类的程序集)。每个assmbly中的IModule的实现将该程序集中的所有实现类都注册到DI容器中。然后我有一个模块加载器类,它扫描程序集,查找该程序集的IModule实现,并调用相应的模块加载方法。通过这种方式,每个程序集都是自包含的,当我想切换实现时,我可以逐字地插入我想要的任何程序集。

有了这种能力,您就可以决定如何将程序集拆分为您想要交换实现的粒度。如果你想要很大的灵活性,那就非常重要,这就是为什么它不是每个人的策略。

在我的研究中,我发现Windsor开发人员认为重写绑定是一种不好的做法,因此几乎没有能力这样做。