gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:00:36 24 4
gpt4 key购买 nike

假设我们有

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/

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