C# 重定向依赖项的设计模式
下面的类图是我正在处理的一个项目的简化版本 类A负责序列化/反序列化以C为根的对象的图形。我使用Csharp的框架进行序列化,因此当我反序列化类C时,框架将创建以C为根的所有内部对象的新实例(如图中*new class所示)。现在我想用Cnew替换A的C实例,但问题是B1和B2仍然指向旧的D1和D2。最好不要重新初始化B2和B2的依赖项 我正在寻找一种方法,使B1和B2能够通过a访问D1和D2,而不允许它们访问C或彼此访问。为了简单起见,我们可以假设A的所有成员都必须是公共的(它实现了一个来自我正在使用的框架的接口,该框架强制许多成员是公共的) 以下是我想到的一些潜在解决方案: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的所有成员都必须是公共的(它实现了一个来自
谢谢 您希望在设计中引入另一个间接层次:本质上,您希望存储的不是对
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
的引用,但它不知道它是这样做的
您是否检查过依赖项注入或反转控制容器?