C# 重定向依赖项的设计模式

C# 重定向依赖项的设计模式,c#,design-patterns,dependencies,C#,Design Patterns,Dependencies,下面的类图是我正在处理的一个项目的简化版本 类A负责序列化/反序列化以C为根的对象的图形。我使用Csharp的框架进行序列化,因此当我反序列化类C时,框架将创建以C为根的所有内部对象的新实例(如图中*new class所示)。现在我想用Cnew替换A的C实例,但问题是B1和B2仍然指向旧的D1和D2。最好不要重新初始化B2和B2的依赖项 我正在寻找一种方法,使B1和B2能够通过a访问D1和D2,而不允许它们访问C或彼此访问。为了简单起见,我们可以假设A的所有成员都必须是公共的(它实现了一个来自

下面的类图是我正在处理的一个项目的简化版本

类A负责序列化/反序列化以C为根的对象的图形。我使用Csharp的框架进行序列化,因此当我反序列化类C时,框架将创建以C为根的所有内部对象的新实例(如图中*new class所示)。现在我想用Cnew替换A的C实例,但问题是B1和B2仍然指向旧的D1和D2。最好不要重新初始化B2和B2的依赖项

我正在寻找一种方法,使B1和B2能够通过a访问D1和D2,而不允许它们访问C或彼此访问。为了简单起见,我们可以假设A的所有成员都必须是公共的(它实现了一个来自我正在使用的框架的接口,该框架强制许多成员是公共的)

以下是我想到的一些潜在解决方案:

  • 咬紧牙关,重新初始化B1和B2

  • 将B1和B2 a引用给a而不是D1和D2,忽略这样一个事实,即这使它们能够访问许多不需要访问的类

  • 对于返回A的D1和D2实例的函数,不给B类直接访问D类的权限,而是给它们一个传入委托(函数指针)

  • 有一个像D1Container和D2Container这样的实现接口,它们有一个必需的方法,该方法将实例返回给D1或D2。然后将A浇铸到D1容器或D2容器,并将其传递到B1和B2

  • 这类事情有没有一种设计模式,或者我的解决方案显然是最好的


    谢谢

    您希望在设计中引入另一个间接层次:本质上,您希望存储的不是对
    D1
    D2
    的引用,而是可以获得最新的
    D1
    D2
    。您的#3(委托)选项对我来说是最优雅的,因为您不需要引入新类来实现延迟评估。您只需要一个
    Func
    ,它
    a
    传递给
    B
    ——没有新的类、接口或委托;一切都很好地封装起来

    class A {
        private B myB;
        private C myC;
        public A() {
            myC = new C();
            myB = new B(() => myC.MyD);
        }
    }
    class B {
        private readonly Func<D> getD;
        public B(Func<D> getD) {this.getD = getD;}
        public D { get { return getD(); } }
    }
    class C {
        public D MyD {get; private set;}
    }
    
    A类{
    私人B myB;
    私营C-myC;
    公共A(){
    myC=新的C();
    myB=新的B(()=>myC.MyD);
    }
    }
    B类{
    私有只读函数getD;
    公共B(Func getD){this.getD=getD;}
    公共D{get{return getD();}}
    }
    C类{
    公共D MyD{get;私有集;}
    }
    
    现在,如果
    A
    更改其
    C
    ,或
    C
    更改其
    D
    B.D
    将继续自动返回正确的
    D
    。这是因为在引擎盖下,
    B
    保存了对
    a
    的引用,但它不知道它是这样做的

  • 二,。忽略我读到的部分需求
  • 如果B可以访问a的定义,并且可以将a回退,使其可以访问C,那么这就是一个问题

  • 这是最有希望的选择。我会通过一个公开事件来实现它,B会监听这些事件


  • 您是否检查过依赖项注入或反转控制容器?