2 つのクラスがあるとしますが、それらはファクトリ経由でのみ作成できます。それを強制するために、ファクトリを作成中のオブジェクトの内部クラスにして、プライベート コンストラクタにアクセスできるようにします。この場合、あるクラスは他のクラスのインスタンスを作成する必要があり、2 番目のクラスは最初のクラスのインスタンスを作成する必要があります。
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
B
A
B
ABFactory
ABFactory
A
B
A
セマンティクスが正しいと仮定すると (この場合、 an が のインスタンスを返し、それが another のインスタンスをB
返すことは論理的に理にかなっています)、これを解決する最善の方法は何ですか?B
A
更新 1
これまでの私の解決策は、 a という新しいクラスを作成することCircularDependencyResolver
です。2 つのファクトリのそれぞれが、他のファクトリではなく、そのファクトリへの依存関係を宣言します。それぞれthis
が、自身のコンストラクターでそのリゾルバーに自身を登録します ( )。それぞれのオブジェクトを構築するときにResolve
、リゾルバーでメソッドを呼び出します。これは、他の登録済みファクトリーを探すか、例外をスローします。
もちろん問題は、A
orB
の依存関係の解決を、プログラムの開始時ではなく、実際に作成する必要があるときまで延期したことですが、それは機能します。
私はまだ他のソリューションに興味があります。