none
クラスライブラリの相互参照について RRS feed

  • 質問

  • お世話になります。mkmarimoと申します。

    いくつもスレッドを立てて申し訳ありません。

     

    現在、Visual C# (VS2005 SP1)でC# の勉強をしております。

     

    ひとつのソリューション内に、EXE1つと、DLL2つのプロジェクトがあります。

    上記のような環境で、2つのDLLをお互いに参照設定から追加しようとすると、

    後の方で、

     

    ------------------------------------------------------------------------------------------------------------

    "XXXXX"への参照を追加できませんでした。

    このプロジェクトを参照として追加しようとすると循環する依存関係を生じます。

    ------------------------------------------------------------------------------------------------------------

     

    というエラーメッセージが表示されてできません。

     

    お互いがお互いの機能を使いたいのですが、このような場合、どのようにすればよいでしょうか。

    2007年9月11日 8:14

回答

  •  mkmarimo さんからの引用

    お互いがお互いの機能を使いたいのですが、このような場合、どのようにすればよいでしょうか。

    お互いを使うような機能はなくすか、1つのdllにまとめるべきだと思います。

    プロジェクト間の参照(依存)は一方向になるように工夫するべきです。
    2007年9月11日 8:27

すべての返信

  •  mkmarimo さんからの引用

    お互いがお互いの機能を使いたいのですが、このような場合、どのようにすればよいでしょうか。

    お互いを使うような機能はなくすか、1つのdllにまとめるべきだと思います。

    プロジェクト間の参照(依存)は一方向になるように工夫するべきです。
    2007年9月11日 8:27
  • 若しくは、もう1つDLLを作成して共通機能となる部分は、そのDLLに実装する。
    2007年9月11日 9:00
  • IIJIMASさん、FC-Shiroさん

     

    mkmarimoです。ご回答ありがとうございます。

     

    やっぱり回避方法は設計のし直しということですね。

     

    了解しました。ありがとうございました。

     

    2007年9月12日 1:51
  • # 「回答済み」 になったので、 安心してチャチャ入れ

     

    ・もしくは、 ソリューションを分ける。
      ※ DLL ファイルを直接参照してやれば、 Visual Studio に循環参照を悟られないはず。

      ※※ でも。 循環参照は、 たいがい難しいバグを生む元になりますので、 やらないように。

     

    ・もしくは、 制御の反転 (IoC: Inversion of Control) をしてやって、 参照を一方向に揃える。

      → Inversion of Control コンテナと Dependency Injection パターン (Martin Fowler)

     

    例えば、 ビジネスロジックと DB アクセッサを分離したとき。
    普通に作ると、 ビジネスロジックから DB アクセッサを参照することになると思います。

    でも、 DB アクセッサから返して欲しいのは、 ビジネスロジックで定義してるオブジェクトだったりして。
    一つの解は、 FC-Shiro さんが書いてくれたように、 そのオブジェクト定義を別の DLL に出して、 両方から参照するようにすること。
    でも、 「そのオブジェクト定義は、ぜったいにビジネスロジックなんだ~っ!」 とワガママw を言う人がいるなら、 DB アクセッサのインターフェースをビジネスロジック側に定義してしまって、 DB アクセッサからビジネスロジックを参照する (制御の反転) ってこともできます。

    2007年9月12日 3:13