构造函数注入替代品(Castle Windsor)

Jef*_*eff 6 .net dependency-injection castle-windsor inversion-of-control

我喜欢构造函数注入依赖注入.它强制从类型中明确声明问题,并有助于可测试性.

我喜欢Constructor注入,在大多数地方......

记录我不喜欢的例子.如果我有一个基类,许多其他类继承,我希望所有这些类都使用我的ILogger(或其他)的实例,我不想要一个静态工厂(Logger.Instance)...我不希望必须在每个采用ILogger的子类上声明构造函数.

所以,我可以让我的基类将logger声明为Property并让它以这种方式注入

public class MyBaseClass 
{
   public ILogger Logger { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

...但

  1. 这并不能保证Logger 实际上被注入并且不是null.
  2. 我不喜欢让ILogger使用公共场景

那么......我还有其他选择吗?(我正在使用Castle Windsor).

我打算制作一个界面

public interface IInitializable<T>
{
    void Initialize(T instance); 
}

public class MyBaseClass : IInitializable<ILogger>, ...could have other IInitializables too...
{
   protected ILogger Logger { get; private set; }

   public void Initialize(ILogger instance) 
   { 
         Logger = instance;
   }
}
Run Code Online (Sandbox Code Playgroud)

然后在我的容器上有一个工具,它自动调用所有IInitializable<T>类型构造的实现......

但在我走这条路之前,我想知道其他人的想法是什么......

Gre*_*vec 1

在你的情况下,我会使用属性注入。

属性注入可以切换为强制,如下所述: http://www.mail-archive.com/castle-project-users@googlegroups.com/msg08163.html