Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 默认构造函数是否应该将null传递给另一个构造函数以创建依赖项?_C#_Dependency Injection_Constructor_Dependencies - Fatal编程技术网

C# 默认构造函数是否应该将null传递给另一个构造函数以创建依赖项?

C# 默认构造函数是否应该将null传递给另一个构造函数以创建依赖项?,c#,dependency-injection,constructor,dependencies,C#,Dependency Injection,Constructor,Dependencies,我有一堆类,它们有一组依赖项。此项目的依赖项注入将是过度的,因此目前我们在许多情况下采用以下模式: public MyClass() : this(null, null) {} public MyClass(Dependancy x, Dependancy y) { this.x = x ?? new Dependancy(); this.y = y ?? new Dependancy(); } 我不喜欢这个代码,但我不确定为什么。一个原因是它会处理传入的参数,另一个原因是我可能希望

我有一堆类,它们有一组依赖项。此项目的依赖项注入将是过度的,因此目前我们在许多情况下采用以下模式:

public MyClass() : this(null, null) {}

public MyClass(Dependancy x, Dependancy y)
{
  this.x = x ?? new Dependancy();
  this.y = y ?? new Dependancy();
}
我不喜欢这个代码,但我不确定为什么。一个原因是它会处理传入的参数,另一个原因是我可能希望参数为null,并保持null


是否有充分的理由避免/使用这种模式或任何其他模式,或者这基本上只是个人偏好?

您不喜欢它是因为两个原因:

不需要向其传递null的参数化构造函数;拥有第二个无参数构造函数; 拥有第三个类名为it Factory,名为it Container并不重要,注入这些默认依赖项与好处相比,永远不会过分。
您不喜欢它是因为两个原因:

不需要向其传递null的参数化构造函数;拥有第二个无参数构造函数; 拥有第三个类名为it Factory,名为it Container并不重要,注入这些默认依赖项与好处相比,永远不会过分。
您发布的代码的一点是,您使用的是依赖项注入,而不是控制反转。MyClass将其依赖项注入其中,但如果它们不是它所期望的,它将承担控制权。这令人不快有几个原因:

较高级别的类MyClass与较低级别的类依赖项耦合。 MyClass充当了一个角色,这本身就是一个反模式,但也违反了单一责任原则。 无参数构造函数具有隐藏的副作用;使用它的地方正在不知不觉地构造MyClass,其依赖项都设置为Dependency。
正如@Alessandro Santini所说,我真的鼓励您放弃这个,使用DI/IoC容器。至少要摆脱无参数构造函数,强制任何想要构造MyClass实例的东西为它提供适当的依赖项。然后,如果给定的依赖项为null,则双参数构造函数应该抛出异常。

您发布的代码中的问题是,您使用的是依赖项注入,而不是控制反转。MyClass将其依赖项注入其中,但如果它们不是它所期望的,它将承担控制权。这令人不快有几个原因:

较高级别的类MyClass与较低级别的类依赖项耦合。 MyClass充当了一个角色,这本身就是一个反模式,但也违反了单一责任原则。 无参数构造函数具有隐藏的副作用;使用它的地方正在不知不觉地构造MyClass,其依赖项都设置为Dependency。
正如@Alessandro Santini所说,我真的鼓励您放弃这个,使用DI/IoC容器。至少要摆脱无参数构造函数,强制任何想要构造MyClass实例的东西为它提供适当的依赖项。然后,如果给定的依赖项为null,则双参数构造函数应该抛出异常。

+1 DI从来都不是多余的。也许您不需要容器,但是模式本身总是比在黑暗中更新依赖项更好的选择。+1 DI从来都不是多余的。也许你不需要容器,但是模式本身总是比在黑暗中更新依赖项更好的选择。很好,我希望每个人都会这么说!谢谢,这是我希望每个人都会说的话!谢谢