web-dev-qa-db-ja.com

循環依存

2つのプロジェクトがあります。

Project#2にはProject#1への参照があります

ここで、Project#1でProject#2を参照する必要がありますが、vs.netは循環依存関係について不平を言っています。

これから抜け出す方法はありますか?

32
mrblah

絶対違う。循環依存関係は、設計が悪いことを示しています。厳しいという意味ではありません。これにはいくつかの方法があります。

1)Project#0などの一般的なコードを別のプロジェクトにリファクタリングできます

2)デザインを修正できます。これはおそらく進むべき道です。

ボブおじさんは、非循環依存原理を含むパッケージング原理に関する優れた記事を持っています。 http://www.objectmentor.com/resources/articles/granularity.pdf 。これを読んで、循環依存が悪いことである理由を理解してください。

63
Craig Wilson

プロジェクトをリファクタリングして、共通要素をプロジェクト#1とプロジェクト#2の両方が参照する「プロジェクト#0」に取り出します。

11
codekaizen

2つを1つにマージするか、再設計します。

6
David M

これは、設計の問題を示しています。 2つ以上のタイプを相互に認識する必要がある場合は、同じアセンブリに存在する必要があります。

6
Adam Ralph

いいえ。プロジェクトを適切に構成します。低レベルから高レベルへの抽象化に基づくある種の順序付けを使用してみてください。

4
wj32

循環依存とは、これらがもはや2つの独立したプロジェクトではないことを意味します(プロジェクトを1つだけ構築することは不可能であるため)。

一方向の依存関係のみを持つようにリファクタリングするか、それらを単一のプロジェクトにマージする必要があります。

3

循環参照前の質問 に見られるようにできますが、あなたはできません誰もがここですでに述べた理由でそれを行う

3
Alfred Myers

私はreallyがスマートな問題になるわけではありませんが、より良いプログラム設計が答えです。

2
David

これは設計上の欠陥であるように思われます。再設計が解決策です。

1
Amit

これは悪い設計だと誰もが言うだろうと思います。しかし、それは言うよりも簡単で、実装を別の共通コードに移動することが望ましくない場合があります。そのような場合は、他のパッケージを直接呼び出すのではなく、1つのパッケージからイベントを発行して、他のパッケージで処理します。そうすれば、他のコンポーネントを最初のコンポーネントの依存関係にする必要はありません。

実装を個別のパッケージに保持したい場合のもう1つの方法は、ロジッククラスフォームインターフェイスを派生させ、それらを個別のパッケージで定義することです。これは、たとえば、依存関係の注入やその他の手段によって実装をインスタンス化する方法がある場合に機能します。

0
user2555515