我喜欢使用构造函数注入(inject)进行依赖项注入(inject)。它可以从类型中明确声明所关注的问题,并有助于可测试性。

我在大多数地方都喜欢构造函数注入(inject)...

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

因此,我可以让我的基类将记录器声明为Property并将其注入(inject)

public class MyBaseClass
{
   public ILogger Logger { get; set; }
}

...但
  • 并不能保证Logger实际上会被注入(inject)并且不为null。
  • 我不喜欢将ILogger与公共(public)集
  • 一起使用

    所以...我还有什么其他选择? (我正在使用温莎城堡)。

    我已经考虑过要制作一个界面
    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;
       }
    }
    

    然后在我的容器上有一个设施,可以在类型构造时自动调用IInitializable<T>的所有实现...

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

    最佳答案

    在您的情况下,我将使用属性注入(inject)。

    可以将属性注入(inject)切换为强制性,如下所示:
    http://www.mail-archive.com/[email protected]/msg08163.html

    关于.net - 构造注入(inject)方案(城堡温莎),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4401490/

    10-16 10:35