构造两个彼此需要的对象

时间:2014-06-14 05:03:11

标签: c# architecture

令人费解的架构问题:您有两个对称类AB。每个A / B对象可以使用IA / IB方法私下生成A.CreateIA() / B.CreateIB()类型的值。相反的类需要这些值 - A需要IBB需要IA

目标是编写构建互连一对PairMaker.MakePair()A对象B函数。您还必须为AB类编写适当的构造函数。 AB类在不同的程序集中,并且看不到彼此的内部。链接应该是安全的 - 外部代码不应该能够访问或修改对象字段。您可以根据需要编写其他类并将任何方法添加到AB - 只是不要破坏链接的安全性。

interface IA { }
interface IB { }

class A {
    IB ib;

    //Some constructor
    //Other members

    IA CreateIA() { }
}

class B {
    IA ia;

    //Some constructor
    //Other members

    IB CreateIB() { }
}

class PairMaker {
    public static Tuple<A, B> MakePair() {
        //What's here?
    }
}

此问题与How to construct two objects, with each other as a parameter/member类似,但该问题未得到妥善回答。

更新:请注意,此问题 IS 可解决(因为您可以编写所需的任何构造函数)。请不要仅因为您无法设计解决方案而进行投票或关闭此问题。

1 个答案:

答案 0 :(得分:0)

这是一个可能的解决方案。我不喜欢它的外观(我讨厌构造函数中的那些out参数)。

class A {
    IB _ib;

    public A(out Func<IA> getter, out Action<IB> setter) {
        getter = CreateIA;
        setter = SetIB;
    }
    void SetIB(IB ib) {
        _ib = ib;
    }
    IA CreateIA() { throw new NotImplementedException(); }
}

class B {
    IA _ia;

    public B(out Func<IB> getter, out Action<IA> setter) {
        getter = CreateIB;
        setter = SetIA;
    }
    void SetIA(IA ia) {
        _ia = ia;
    }
    IB CreateIB() { throw new NotImplementedException(); }
}

class PairMaker {
    public static Tuple<A, B> MakePair() {
        Func<IA> iaGetter;
        Func<IB> ibGetter;
        Action<IA> iaSetter;
        Action<IB> ibSetter;
        A a = new A(out iaGetter, out ibSetter);
        B b = new B(out ibGetter, out iaSetter);
        iaSetter(iaGetter());
        ibSetter(ibGetter());
        return Tuple.Create(a, b);
    }
}