gpt4 book ai didi

.net - 构造函数注入(inject)替代方案(温莎城堡)

转载 作者:行者123 更新时间:2023-12-04 15:27:16 25 4
gpt4 key购买 nike

我喜欢依赖注入(inject)的构造函数注入(inject)。它强制从类型中明确声明关注点,并有助于可测试性。

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

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

所以,我可以让我的基类将记录器声明为属性并以这种方式注入(inject)

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

...但
  • 这并不能保证 Logger 实际上被注入(inject)并且不为空。
  • 我不喜欢 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> 的所有实现的工具在类型构造...

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

    最佳答案

    你把这件事复杂化了。 recommended and documented pattern to inject ILogger是有NullLogger.Instance作为默认值(即 null object pattern )并使 Logger一个可选的依赖。为记录器设置公共(public) setter 并没有错。使用自定义 IInitializable就像您展示的那样,可能只会使事情复杂化,而不会贡献任何真正的值(value)。

    我将从此处的文档中复制示例以便于引用:

    using Castle.Core.Logging;

    public class CustomerService
    {
    private ILogger logger = NullLogger.Instance;

    public CustomerService()
    {
    }

    public ILogger Logger
    {
    get { return logger; }
    set { logger = value; }
    }

    // ...
    }

    编辑:似乎问题实际上是关于根据上下文使用不同的记录器实现(这与原始问题几乎没有关系)。如果是这种情况,请使用服务覆盖或处理程序选择器。

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

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com