如何使用Castle Windsor注入基类?

时间:2015-05-12 11:15:17

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

我想要使用Castle Windsor配置一系列核心服务,例如日志记录,缓存,电子邮件配置等。通过app.config更改可以轻松配置这些服务将是一个很大的好处(例如,甚至只是对于开发/测试来说,能够告诉应用程序通过除实际邮件服务器之外的其他机制来路由所有电子邮件流量,这很棒。

两个问题:

  1. 许多需要访问这些服务的类都是从一个抽象基类继承的(包含所有子类使用的核心逻辑)所以将核心服务以某种方式注入到这个基类似乎是理想的,这样所有的孩子都会继承对服务的引用。注意这些子类也都实现了一个接口,这样可能是更好的路径吗?
  2. 我还有一个场景,其他程序集中不相关的对象也需要能够利用核心服务。这些对象不是由我实例化的,而是由其他库实例化的(我实现了某些第三方库的接口,然后在其框架中使用我的实现)。如果我需要访问此代码中的电子邮件或日志记录或其他核心服务,我该如何获得参考?
  3. 我希望这是有道理的,谢谢。

1 个答案:

答案 0 :(得分:2)

关于第一点,请使用property injection

注入依赖项有两种选择;通过构造函数或通过属性。由于您不希望在构造函数链中传递依赖关系,因此唯一的另一种方法是通过属性注入。这样做的好处是,如果基类需要添加/删除/更改依赖项,它不会影响从它继承的所有内容。

有些人(包括我自己)回避了属性注入,因为它使得依赖关系不明显,并且可能意味着它们是可选的。这可以使单元测试(你正在这样做,对吗?)很困难,因为你必须检查类以查看需要哪些依赖项。如果他们在构造函数中,那很明显。

但是,如果你可以使你的服务理智null-object implementations以便他们 可选,或者单位测试的影响不会使你逐步发展,那么这是一个很好的途径走了。

关于你的第二个问题,如果你无法控制如何创建类,你不能指望Windsor提供任何依赖。最多可以单独解决依赖关系(即调用container.Resolve<IYourDependency>())并将它们分配给实现的属性。