Project#1には、project#2が参照するいくつかのインターフェースとクラスがあります。
ここで、Project#1でProject#2の実装を使用したいのですが、vs.netは循環依存について文句を言います。
Project#1で依存関係インジェクションを使用し、Project#2の実装にバインドする場合(インターフェイスコントラクトに準拠しているため)、これは機能しますか、それとも実行時に循環依存関係エラーメッセージが表示されますか?
Project#1には、project#2が参照するいくつかのインターフェースとクラスがあります。
ここで、Project#1でProject#2の実装を使用したいのですが、vs.netは循環依存について文句を言います。
Project#1で依存関係インジェクションを使用し、Project#2の実装にバインドする場合(インターフェイスコントラクトに準拠しているため)、これは機能しますか、それとも実行時に循環依存関係エラーメッセージが表示されますか?
おそらくDIでこれを解決できますが、そうすべきではありません。
私の理解が正しければ、次のようなものがあります。
+ アセンブリ A + アセンブリ B | | | | +-- インターフェイス IFoo +-- クラス ConcreteFoo : IFoo | | ^ +-- クラス MyClass -->------->-------|
MyClass
つまり、参照を取得しようとしていますが、存在するConcreteFoo
assembly が既に in に依存しているため、取得できません。B
ConcreteFoo
IFoo
A
これは設計エラーです。IFoo
Assemblyでインターフェイスを宣言し、A
具体的な実装を宣言しない場合、アセンブリ内の他のインターフェイス/クラスA
はのみを参照IFoo
し、それを実装する具体的なクラスは参照しないでください。
循環依存を解消するには、次の 3 つの方法があります。
の代わりにMyClass
依存するようにします。可能であれば、これがおそらく最良の選択肢です。で使用するための の物理インスタンスが必要で、どこから取得すればよいかわからないという問題がある場合は、コンストラクターで を取得します。IFoo
ConcreteFoo
IFoo
MyClass
IFoo
MyClass
IFoo
インターフェイスを独自のアセンブリに移動します。これはまだかなり良い習慣です。デザインは次のようになります。
+ アセンブリ アプリ + アセンブリ インターフェイス + アセンブリ コンクリート | | | | | | | | +-- インターフェイス IFoo | | | | | \ | +-- クラス MyClass | \------+-- クラス ConcreteFoo | | | | | | ^ +---- メンバー フー ->--------------------->------------------- | |
MyClass
独自のアセンブリに移動します。事実上、依存関係ツリーは上記の #2 と同じように見えますが、アセンブリA
がそれよりもはるかに小さい場合B
、必要な労力は少なくなります。
それが役立つことを願っています。
多くの場合、Abstract Factory を使用して依存性注入 (DI) で循環依存性の問題を解決できます。例については、こちらを参照してください。
ただし、DI で問題を解決できる場合もありますが、API を再設計して循環依存をなくした方がよいでしょう。
多くの場合、エンドの 1 つをクエリ ベースの API からイベントベースの API に変更することで、循環依存関係を解消できます。
Project1コードでProject1のクラスとインターフェイスのみを使用している限り、問題はありません。(依存性注入の構成は、プロジェクト1のコードベースの外部で行われると想定しています。)
しかし、循環依存の存在は、なぜそれが存在するのかを疑問視し、それを取り除く問題を解決する他の方法についての考えを促すはずです。