Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.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# 类构造函数应该只用于依赖项注入吗?_C#_Dependency Injection_Constructor - Fatal编程技术网

C# 类构造函数应该只用于依赖项注入吗?

C# 类构造函数应该只用于依赖项注入吗?,c#,dependency-injection,constructor,C#,Dependency Injection,Constructor,类构造函数可以通过两种主要方式填充其类的依赖项: 通过构造函数依赖项注入填充类依赖项 通过使用构造函数参数在构造函数中运行一些计算来填充类依赖项。依赖项根据计算结果实例化。这可能涉及使用new 我想知道第二种方法是否遵循良好的编码实践,如单一责任原则,以及这种功能是否真的属于类构造函数。这似乎很方便,但我不确定这是否是个好主意 这里有一个例子来说明我的意思: 公共类向量空间 { //此类依赖于向量数组。 向量集; //1.通过构造函数依赖项注入填充类依赖项。 公共向量空间(向量[]spannin

类构造函数可以通过两种主要方式填充其类的依赖项:

  • 通过构造函数依赖项注入填充类依赖项
  • 通过使用构造函数参数在构造函数中运行一些计算来填充类依赖项。依赖项根据计算结果实例化。这可能涉及使用
    new
  • 我想知道第二种方法是否遵循良好的编码实践,如单一责任原则,以及这种功能是否真的属于类构造函数。这似乎很方便,但我不确定这是否是个好主意

    这里有一个例子来说明我的意思:

    公共类向量空间
    {
    //此类依赖于向量数组。
    向量集;
    //1.通过构造函数依赖项注入填充类依赖项。
    公共向量空间(向量[]spanningSet)
    {
    this.spanningSet=spanningSet;
    }
    //2.通过在构造函数中运行一些计算来填充类依赖项。
    公共向量空间(矩形,int numberOfCellsX,int numberOfCellsY)
    {
    //构造此类以确保生成的向量空间适合给定的矩形,从而形成网格。
    //一些最终填充类依赖项的计算在这里。。。
    }
    //使用向量执行计算的公共方法请参见此处。。。
    }
    
    这感觉很奇怪,因为让向量空间填充一个网格感觉像是一个超出了这个类范围的工作,但是我不知道我还能在哪里定义第二个构造函数


    第二个构造函数的功能适合于这个类吗?如果没有,我将把这个构造函数主体移动到哪里?我应该改用静态工厂方法吗?我应该让这个构造函数成为另一个类的构造函数吗?也许我可以在某个地方有一个类似的方法,它返回一个向量数组,我可以将该数组传递到依赖项注入构造函数,但是我应该在哪里定义该方法呢?

    VectorSpace
    类取决于数据(向量集),但数据可以通过多种方式提供/计算。
    如果您改变向量的计算/检索方式,
    VectorSpace
    的逻辑是否会改变?我假设不是,所以它不应该是
    VectorSpace
    类的一部分

    我们可以创建专门的类来负责计算所需的数据

    public class SpanningSetFactory
    {
        public Vector[] Create(Rect rectangle, int numberOfCellsX, int numberOfCellsY)
        {
            // Calculate and return set of vectors
        }
    }
    
    现在VectorSpace可以明确地“告诉”其他开发人员/读者它只依赖于向量集

    public class VectorSpace
    {
        public VectorSpace(Vector[] spanningSet) => _spanningSet = spanningSet
    }
    
    现在,两种逻辑“计算扩展集”和“使用扩展集”都将位于各自的位置,彼此之间没有依赖关系-它们之间唯一的依赖关系链接将是
    向量数组

    我建议避免在构造函数中进行一些计算(尤其是繁重的计算)。
    当关键逻辑(计算、数据检索)以方法或其他类型的形式显式可见时,对其他开发人员有很好的帮助