首页 > 解决方案 > StackOverFlow 在实现交叉引用类的依赖倒置原则中

问题描述

情况:

我有三个班级:社会,父亲和儿子。该协会有一份父亲名单。每个父亲都有一个儿子。在这个应用中,每个父亲都必须知道他的儿子是谁,反之亦然,每个儿子都知道他的父亲是谁。

我使用直接交叉引用,将父亲指定为子的属性,将子指定为父类的属性,如下所示:

public class Society : ISociety
{
    public List<IFather> Fathers {get; set;}
}


public class Father : IFather
{
    public Father(ISon inp_son)
    {
       MySon = inp_son; 
    }

    public ISon MySon {get; set;} 
}


public class Son : ISon
{
    public Son(IFather inp_father)
    {
       MyFather = inp_father;  
    }

    public IFather MyFather {get; set;}
}

为了手动实现依赖倒置,我有一个名为 Factory 的公共静态类。Factory 通过其方法返回 Society、Father 和 Son 类的接口。这些方法实例化 Society、Father 和 Son 类,并将它们分别返回为 ISociety、IFather 和 Ison。

public static Factory
{
    public static IFather CreateFather()
    {
        return new Father(CreateSon());
    }


    public static ISon CreateSon()
    {
        return new Son(CreateFather());
    }
}

应用程序运行如下。

.
.
.
     IFather Father = Factory.CreateFather();
     Society.Fathers.Add(Father);      
.
.
.

问题

每次工厂创建一个父亲时,它都会通过调用 CreateSon() 方法实例化一个儿子作为其构造函数输入。当 CreateSon() 方法创建一个 Son 时,它会调用 CreateFather() 方法。这会导致无限循环,从而导致 StackOverFlow 问题。

大图

我有一个大型的类库。在我的库中,高级类有低级类的列表。计算在较低级别的类中执行。计算需要访问更高级别的类的属性。因此,计算需要以某种方式通过它们所属的低级类找到更高级别的类。

为了能够对代码进行单元测试,我需要通过将Factory.CreateFather()in 传递给 Son.cs 类的构造函数来实例化 Son 类。这样做可以让我在不破坏代码的情况下用 Factory 类中的母亲类交换父亲类。

除了这两种方式之外,我不知道还有一种更优雅的方式可以让子知道父是谁:

1-上述方法,通过直接分配儿子的MyFather属性进行交叉引用。

2-在儿子中保存父亲的标识符属性(整数或 Guid)。所以儿子可以通过以下方式搜索父亲:Father MyFather = Society.Fathers[MyFathersNumber]。鉴于父亲列表被控制为没有重复。这种方法的问题在于,在一个长长的层次结构链中,访问一个类的几层变得困难导航和冗长的代码行。

在没有依赖倒置的情况下,我之前已经从方式 2 转移到方式 1 作为一种更清洁的方法。现在,当我将方式 2 与 DI 原理结合起来时,我遇到了 StackOverFlow 问题。

我的问题

有人可以告诉我在不与依赖倒置原则发生冲突的情况下让儿子知道他父亲是谁的优雅方式是什么?

谢谢你。

标签: c#design-patternshierarchysolid-principlesdependency-inversion

解决方案


推荐阅读