假设我有两个类,但它们只能通过工厂创建,为了强制执行,我将工厂创建为它们正在创建的对象的内部类,以便它们可以访问私有构造函数。在这种情况下,一个类需要创建另一个类的实例,而第二个类需要创建第一个类的实例:
public class A
{
public class Factory
{
private readonly B.Factory bFactory;
public Factory(B.Factory bFactory)
{
this.bFactory = bFactory;
}
public A Build()
{
return new A(this.bFactory);
}
}
private A(B.Factory bFactory)
{
}
}
public class B
{
public class Factory
{
private readonly A.Factory aFactory;
public Factory(A.Factory aFactory)
{
this.aFactory = aFactory;
}
public B Build()
{
return new B(this.aFactory);
}
}
private B(A.Factory aFactory)
{
}
}
通常我会通过创建另一个工厂来解决这个问题,该工厂ABFactory
可以同时创建A
andB
实例,并且我会 make A
and B
both 声明对 的依赖ABFactory
,但在这种情况下ABFactory
无法访问两者的私有构造函数A
and B
。
假设语义是正确的(在这种情况下,A
返回 an 的实例B
和B
返回 another 的实例是合乎逻辑的A
)那么解决这个问题的最佳方法是什么?
更新 1
到目前为止,我的解决方案是创建一个名为 a 的新类CircularDependencyResolver
。两个工厂中的每一个都声明依赖于它而不是另一个工厂。每个人都this
在自己的构造函数中向该解析器注册自己()。当他们去构建各自的对象时,他们会调用Resolve
解析器上的方法,它会寻找其他注册的工厂,或者抛出异常。
问题当然是我们推迟了解决A
orB
的依赖,直到我们真正需要创建它,而不是在程序启动时,但它确实有效。
不过,我仍然对其他解决方案感兴趣。