假设我们有
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/