一尘不染

设计-使用Windsor时应在哪里注册对象

c#

已关闭 。这个问题是基于观点的。它当前不接受答案。


想改善这个问题吗? 更新问题,以便通过编辑此帖子以事实和引用的形式回答。

2年前关闭。

我的应用程序中将包含以下组件

  • 数据访问
  • 数据访问测试
  • 商业
  • 业务测试
  • 应用

我希望使用温莎城堡(Castle Windsor)作为IoC将各层粘合在一起,但是我对胶粘剂的设计还不确定。

我的问题是谁应该负责将对象注册到温莎?我有两个主意;

  1. 每层都可以注册自己的对象。为了测试BL,测试平台可以为DAL注册模拟类。
  2. 每一层都可以注册其依赖对象,例如,业务层注册数据访问层的组件。为了测试BL,测试台必须卸载“真实的” DAL对象并注册模拟对象。
  3. 应用程序(或测试应用程序)注册依赖项的所有对象。

我正在寻找一些不同途径的想法和优点/缺点。


阅读 260

收藏
2020-05-19

共1个答案

一尘不染

通常,应尽可能晚地组装应用程序中的所有组件,因为这样可以确保最大程度的模块化,并且模块应尽可能松散地耦合。

实际上,这意味着您应该在应用程序的根目录下配置容器。

  • 在桌面应用程序中,这将在Main方法中(或非常接近)
  • 在ASP.NET(包括MVC)应用程序中,该文件位于Global.asax中
  • 在WCF中,它将位于ServiceHostFactory中
  • 等等

容器只是将模块组合成可运行的应用程序的引擎。原则上,您可以手动编写代码(这称为“ 穷人的DI” ),但是使用像Windsor这样的DI容器要容易得多。

理想情况下,这样的“ 合成根” 将是应用程序根目录中的唯一代码,从而使应用程序成为所谓的“ 谦虚可执行文件”
(来自出色的xUnit测试模式),它本身不需要单元测试。

您的测试根本不需要容器,因为您的对象和模块应该是可组合的,并且可以从单元测试中直接为它们提供 Test Double 。最好将所有模块设计为与容器无关。

同样在Windsor中,您应该将组件注册逻辑封装在安装程序中(类型实现IWindsorInstaller),有关详细信息,请参阅文档

2020-05-19