2009-06-02 35 views
1

私は2つのプロジェクトを持つソリューションを持っています。C# - 循環参照で名前空間を参照できません

1つのRavenは、2番目のプロジェクトであるPPatherにデータを提供する単純なベースです。 2番目のプロジェクトは、それを構築するために最初にコンパイルすることに依存します.Ravenへの参照を追加します。これまでのところすべて正常に動作します。

今、私はRavenにPPatherを起動させたい。しかし、私はできないので、PPatherのネームスペースを見ることはできません。これを解決するためのすべての努力は、循環参照エラーにつながります。

誰かが、Ravenに依存するPPatherプロジェクトの名前空間をどのように見ることができるのか分かりますか?

+0

彼らがお互いに依存している場合、それらはなぜ別々のアセンブリにありますか? –

+0

問題を解決するためのより良い方法を見つけられるように、アプリケーションの詳細を投稿できますか? –

答えて

13

あなたは望むように循環的にアセンブリを参照する方法がありません。循環参照を作成する必要がある場合は、おそらくこれらのアセンブリを適切に設計していない可能性があります。

最初のアセンブリは依存関係であるため、の依存関係以外のことを知っているコードはありません。あなたのアセンブリが "スマート"になり、自分自身の依存関係以外の知識があれば、深刻なメンテナンスとスケーラビリティの頭痛が始まります。循環参照を作成する必要がないような方法でコードを再編成します。

+1

両方の文に同意します。 –

+1

もっと同意できませんでした。悪夢のように聞こえる。 CMakeが循環依存につながるCMakeのバグを思い出させるので、CMakeは無限ループでハングします。 – OregonGhost

+1

私は再設計が必要なようです。速い明確な答えのために多くのありがとう! – Patrick

0

1つのコンポーネントに結合したくない場合は、これを達成するためにできることがたくさんあります。すべては、基本的に依存関係の1つを逆転させるか、または両方が依存する第3のコンポーネントを作成するように努めます。

Ravenが出発点だと思われるので、PPatherがRavenで求める機能セットを反映したPPatherコンポーネントに基本クラスまたはインタフェースを作成することが考えられます。 Ravenはこの基本クラスを実装し、PPatherのインスタンス化/呼び出し時に "this"ポインタをインクルードすることができます。 PPatherは、自分自身のアセンブリ内の基本クラス(またはインタフェース)へのポインタを期待します。したがって、自身の抽象的な場合を除き、Ravenを "知る"ことは決してありません。したがって、循環依存性は(依存性注入によって)破られます。

2

アンドリューが言っているように、あなたはできないし、あなたがしたいと思うことはあまり意味がありません。

基本的には、次のいずれかを実行します。

  • は、アセンブリをマージします。もし彼らが本当に相互に密接に関係していれば、最初は別々ではないはずです。

  • アセンブリは、双方向で相互に直接依存しないように再設計してください。例えば、アセンブリAをアセンブリCで定義されたインタフェースに依存させ、アセンブリBにこのインタフェースを実装させる(両方ともCに依存する)。

0

循環参照を追加できないことは幸いです。これはメンテナンスの悪夢を引き起こすためです。

RavenにPPatherを起動しますか? PPatherはコンソール/ Windowsアプリケーションですか? Process.Startを使用してそれを行います(レジストリにPPatherの場所をどこかに保存します)。

また、PPatherから必要なクラスのインターフェイスを作成し、PPatherのクラスでそれらのインターフェイスを実装するようにします。

interface IPPatherInterface // Inside of Raven. 
{ 
    void Foo(); 
} 

class PPatherClass : IPPatherInterface // Inside of PPather 
{ 
    // ... 
} 

class SomeRavenClass // Static maybe? Inside of Raven 
{ 
    void SupplyPPatherClass(IPPatherInterface item) { ... } 
} 

これで、PPatherがそのインタフェースの実装をRavenに提供できるようになりました。

0

パンサーがカラスから別のアセンブリに使用する必要があるカラスを枝に入れ、パンサーとレイヴンの両方に参照させる必要があります。

Ravenがパンサーを実行する必要がある場合は正直言っても、あなたのデザインはちょっとしたものだと思います。あなたのコードをより管理しやすいものに分解する必要があります。