当前位置:  开发笔记 > 编程语言 > 正文

构造函数注入和默认重载

如何解决《构造函数注入和默认重载》经验,为你挑选了1个好方法。

让我们说我们有

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())
{}

这是一个普遍的问题,即时间戳不是有趣的部分.



1> Mark Bracket..:

我认为这取决于场景,并且基本上取决于代码所在的消费者(库与应用程序)以及您是否使用IoC容器.

如果您正在使用IoC容器,并且这不是公共API的一部分,那么让容器执行繁重的工作,并且只使用单个构造函数.添加no-args构造函数只会让事情变得混乱,因为你永远不会使用它.

如果这是公共API的一部分,那么请保留两者.如果您正在使用IoC,请确保您的IoC找到"最贪婪"的构造函数(具有最多参数的构造函数).不使用IoC的人,但使用您的API将不会构建整个依赖图以便使用您的对象.

如果您没有使用IoC容器,但只想使用模拟进行单元测试,请保留no-args构造函数,并使内部的贪婪构造函数.为您的单元测试程序集添加InternalsVisibleTo,以便它可以使用贪婪的构造函数.如果您只是单元测试,那么您不需要额外的公共API表面.

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有