c# - 构造函数注入(inject)和默认重载

标签 c# .net dependency-injection

假设我们有

public interface ITimestampProvider
{
    DateTime GetTimestamp();
}

和一个使用它的类

public class Timestamped
{
    private ITimestampProvider _timestampProvider

    public Timestamped(ITimestampProvider timestampProvider)
    {
        // arg null check

        _timestampProvider = timestampProvider;
    }

    public DateTime Timestamp { get; private set; }

    public void Stamp()
    {
        this.Timestamp = _timestampProvider.GetTimestamp();
    }
}

以及以下的默认实现:

public sealed class SystemTimestampProvider : ITimestampProvider
{
    public DateTime GetTimestamp()
    {
        return DateTime.Now;
    }
}

引入这个构造函数是有用还是有害?

public Timestamped() : this(new SystemTimestampProvider())
{}

这是一个一般性问题,即时间戳不是有趣的部分。

最佳答案

我认为这取决于场景,基本上取决于代码的使用者(库还是应用程序)以及您是否使用 IoC 容器。

  • 如果您使用的是 IoC 容器,并且这不是公共(public) API 的一部分,那么让容器来完成繁重的工作,并且只有一个构造函数。添加无参数构造函数只会让事情变得困惑,因为您永远不会使用它。

  • 如果这是公共(public) API 的一部分,则保留两者。如果您使用 IoC,只需确保您的 IoC 找到“最贪婪”的构造函数(参数最多的构造函数)。不使用 IoC 但使用您的 API 的人会很高兴不必为了使用您的对象而构建整个依赖关系图。

  • 如果您不使用 IoC 容器,而只是想使用 mock 进行单元测试,请保留无参数构造函数,并将贪婪构造函数设为内部。为您的单元测试程序集添加 InternalsVisibleTo,以便它可以使用贪婪构造函数。如果您只是进行单元测试,则不需要额外的公共(public) API 表面。

关于c# - 构造函数注入(inject)和默认重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/300286/

相关文章:

c# - 一元 : Why unary's behavior in c# varies with c/c++

c# - 奥尔良无国籍 worker

.Net 用户范围应用程序设置文件路径问题

c# - 使用相同的接口(interface)但不同的构造函数参数注册多个单例

java - 我看到 "Re-entry is not allowed"是什么意思?

c# - 如何使用 OpenSSL.net 创建证书

c# - 如何在 ReSharper 中重置 foreach 自动完成行为

c# - Console.ReadLine 和 Console.In.ReadLine 之间的区别

c# - 无法设置 Microsoft POS C# CharacterSet 属性。

dependency-injection - 无实现类型工厂问题