2009-08-03 21 views
1

私はちょっとした問題を抱えています。ソフトウェアの設計上の問題:循環依存

状況

ライブラリインタフェース

は、すべてのモデルクラスのためのインターフェース(getterとsetterのみ)が含まれ

Libray Businnesロジック

は、インタフェース・ライブラリとDALの実装が含まれています。 は、サードパーティのWebサービスをメッセージングのためのクラスが含まれています: は、インタフェース&トランスポーターライブラリ

ライブラリトランスポーターを使用します。また、必要に応じて、サードパーティのライブラリの参照やWeb参照を追加したいと思っています。 インターフェイスライブラリを使用します。

これまでのところ良好です。現在、循環依存はありません。 Webサービスを呼び出す必要があるとすぐに、ビジネスロジックライブラリは "transporter"ライブラリを使用してexternメソッドを呼び出します。これはかなりうまくいく。

しかし、私は第三者が私たちの側でビジネスオブジェクトを作成できるはずのWebサービスを作成する必要があります。私は、外部のwebserviesのためにbussinesオブジェクトがメッセージオブジェクトに変換される "Transform library"を作成したいと思います。そして、私の現在のアーキテクチャには問題があると思います。このライブラリを作成したい場合は、循環依存関係があります。理由の

  • トランスポーターの参照が
  • を変換しているライブラリの参照を変換 BL
  • BL参照トランスポーター

私はよく私の状況を説明することができることを願っています。

これを解決するためのあらゆるアイデアに感謝します。

答えて

8

Dependency injection

  1. "トランスポーター" が提供するITransporterインタフェース たモデルサービスを作成します。それをインタフェースライブラリに入れてください。 TransporterITransporterを実装してください。
  2. ビジネス・ライブラリで Transporterを直接使用するのではなく、 をITransporterインタフェース に対してプログラムします。現在、ビジネス ライブラリは、 トランスポータライブラリへの依存関係をもう必要としません。あなたは一緒にすべてを接着アプリケーション/ Webサービス で
  3. 、 はTransporter のインスタンスを作成し、あなたのビジネス コードで ITransporterオブジェクトを必要な場所にそれを注入します。
+0

+1右の大槌のために。しかし、モジュール化を再考することによるように、それほど強力な解決策はまだないかもしれない。 –

+0

hmmはうまく聞こえます 私はトランスポータライブラリーにトランスフォーメーションも含める必要がありますか? – nWorx

+0

@unicron:必ずしもそうではありません。 –

1

デザインを再考する方法があります。すべてのサードパーティWebサービスを1つのDLLにグループ化し、必要な機能(変換)を別のライブラリに移動することは理にかなっていますか?適切な機能を持つ各Webサービス(またはグループ化するのが合理的な場合は、サービスのグループ)ごとに個別のアセンブリを作成する方が合理的だと思います。

また、「すべてのプロジェクトでトランスポータの機能が必要ではない」と仮定して、いくつかの誤りがあります。この場合、ビジネスロジックアセンブリはそれに依存しているのはなぜですか?

+0

hmmすべてのサードパーティのWebサービス用に単一のライブラリを作成しないことをお勧めします。 あなたのセカンドポイントは真です、私の仮定は間違っていました。すべてのプロジェクト*で輸送機能が必要ですが、使用されていません*。特別な場合にのみ使用されます。私は私の質問を修正します。 – nWorx

0

私はトランスポーターライブラリにトランスフォーメーションコードを入れます。変換はサービス固有であり、それらをトランスポートから分離する必要はありません。ネームスペースを使用して、異なるサービスとその変換を分離することができます。私は、すべてのサービスを単一のライブラリに入れないことも検討します。単一のライブラリに置くことで、細かい方法で参照することができなくなります。救助へ

+0

私はこれを試してみましたが、私はトランスポート - > blとbl - >トランスポートから循環参照への参照が必要です トランスフォーム(名前空間またはライブラリ)で有効なビジネスオブジェクトを作成する方法がわかりません – nWorx