2

使用构造函数注入,一个依赖被注入到这样的消费者中(至少我希望我理解正确):

public class SomeConsumer
{
    private IDependency someDependency;
    public SomeConsumer(IDependency someDependency)
    {
        if (someDependency != null)
        {
            this.someDependency = someDependency;
        }
        else
        {
            throw new ArgumentNullException("someDependency");
        }
    }

    public void Baz()
    {
        someDependency.DoSomething();
    }
    (...)
}

如果我要为 IDependency 使用 Null 对象模式,我需要保护子句吗?还是注入 Null 对象是错误的?

更新:为了澄清,假设我有这样的类和接口:

public interface IDependency
{
    void DoSomething();
}

public class NullDependency : IDependency
{
    public void DoSomething()
    {
        //Do nothing...
    }
}

public class RealDependency : IDependency
{
    public void DoSomething()
    {
        Console.WriteLine("Did something");
    }
}

public class Foo
{
    public void Bar()
    {
        IDependency dependency = new NullDependency();
        SomeConsumer sc = new SomeConsumer(dependency);
        sc.Baz();
    }
}

然后我可以安全地从 SomeConsumer 中删除保护子句,使其看起来像:

public class SomeConsumer
{
    private IDependency someDependency;
    public SomeConsumer(IDependency someDependency)
    {
        this.someDependency = someDependency;
    }

    public void Baz()
    {
        //if someDependency is a NullDependency, this does nothing
        someDependency.DoSomething(); 
    }
    (...)
}

或者我应该使用保护子句,因为我不能确定它null永远不会被注入?

4

3 回答 3

2

恕我直言,在以下情况下我会放弃保护条款:

  • SomeConsumer仅在您的产品中使用
  • 空对象模式完全由您的团队和/或依赖注入容器配置实现

如果出现以下情况,我可能不会放弃保护条款:

  • 没有为目标受众充分记录对空对象的需求
  • SomeConsumer是开放 API 的一部分,供不了解空对象模式的开发人员使用
  • 我想在我的依赖注入容器实例化时收到反馈SomeConsumer,我犯了一个错误
于 2015-01-02T13:00:49.187 回答
2

我不喜欢在任何情况下放弃保护条款。无论谁使用这个类,创建的所有对象都应该是有效的。如果您允许通过构造函数注入 null,则您允许构造无效对象。稍后,当调用方法时,某些东西会中断。

这个类是否是内部的不是问题。问题是你会确保在调用构造函数时在所有地方都采取了所有措施来产生非空值吗?即使您的回答是“是”,下一个问题是您为什么要浪费时间和精力检查它?

只要留下保护子句,你就会知道这个类的所有对象都将被正确构造。否则,如果您无意中将 null 传递给构造函数,则某些完全不相关的类将失败,并且您将很难将错误追溯到此构造函数。

在相关的说明中,一些保护子句(那些测试条件不是空的)通常是重新考虑设计的原因。您可能会发现这篇文章很有趣 -为什么我们需要保护条款?

于 2015-08-19T20:27:33.437 回答
0

恕我直言,注入一个空对象是非常好的,这在测试中经常使用。当我不关心这种依赖关系时,我经常在单元测试中注入具有默认行为的模拟。

我可能会null用抛出异常或完全删除它来替换检查。它目前没有做任何事情,因为someDependency变量的默认值是null无论如何。

于 2015-01-02T11:00:20.247 回答