2009-08-24 19 views
4

私は一日中座っていた循環参照/依存関係にいくつかの問題があります。私の思考プロセスに何かが間違っていなければならない、私はそれを得ない。 円の参照を解決する(C#)

Flip.Main  (ASP.NET MVC) 
Flip.Domain (C# DLL) 
Flip.Services (C# DLL) 
Flip.Utility (C# DLL) 

電流基準/依存性::

Flip.Main ->  Flip.Domain, Flip.Services, Flip.Utility 
Flip.Services -> Flip.Domain, Flip.Utility 
Flip.Domain -> Flip.Utility 

私は私のサービスプロジェクトは、すべてのサービスを持っているように、私のプロジェクトを構築したかった、私のドメインプロジェクトモデル、リポジトリここで

は私のプロジェクトですモデルを照会するための「流暢な」拡張機能と、メインプロジェクトとユーティリティプロジェクトはかなり説明的です。

問題が発生しました:

1)私は、ローカライズされた電子メールを送信する必要が私のFlip.ServicesプロジェクトでEmailServiceを持っています。すべてのローカライズはFlip.MainのApp_GlobalResourcesで行われます。 Flip.Mainがすでにサービスレイヤーに依存しているので、厳密に型付けされた電子メールや他のローカライズされたリソースを私のサービスレイヤーにどうやって取得するのか分かりません。したがって、Mainプロジェクトに依存することができます。

2)ビジネスクラスがあります。厳密に型指定された検索クエリを表すCustomerSearchFilter。 Flip.Domainプロジェクトの外にあるビジネスクラスは、ドメインモデルの一部ではないため、このクラスを必要とします。しかし、CustomerSearchFilterクラスでは、ドメインクラスに関するインスタンス(CustomerGroupなど)があるため、ドメインクラスについて知る必要があります。同時に、Flip.DomainプロジェクトのFluentインターフェイスは、CustomerSearchFilterが何であるかを知る必要があるため、IQueryableインターフェイスに適用することができます。循環参照。

3)ASP.NET MVC Flip.Mainプロジェクトで特定のコントローラアクションをデコレートするカスタム[AuthorizeSessionState]属性があります。これは、私のFlip.Servicesプロジェクトにある私のSessionServiceをインスタンス化する必要があるActionFilterAttributeです。私はこれを私のUtilityクラスに入れることはできません(Flip.Servicesは既にFlip.Utilityを参照しているためです)。私は彼らがFlip.Mainのいずれかにあるべきだとは思わない - 私はこれのために別のプロジェクトを作らなければならないのですか?私は他の人が通常、循環参照の問題が発生していないことを読んで、特に

(20以上)

私はラインの下のどこかでミスを作っているように私は感じて、。助けて?

答えて

5

すべての非自明なクラスにインターフェイスを使用します。インターフェイスを実装とは異なるアセンブリに配置する。

+2

これは、私が項目2のために提案しようとしていたものです。2つの兄弟アセンブリが互いにクラスを知っている必要があると感じたら、インタフェースを分割して、それらを両方使うようにしてください。 –

+0

あなたが考慮できる1つのことは、インターフェイスの代わりに仮想メンバーを持つ基本タイプを使用することです。このようにして、ホストアプリケーションに機能的なデフォルト実装を提供することができます。これにより、テストが容易になり、実装といくつかのロジックを共有できます。 – mcintyre321

0

質問は、名前空間で分けるものと、DLLで分けるものに分かれています。すべてのモジュールをモジュール化し続けるのに十分な理由があるなら、本当に難しい作業が必要です。しかし、これらのDLLのそれぞれにクラスまたはクラスが2つしかない場合は、おそらくそれらを一緒にマージできますか?

+0

DLLはかなり大きいです。 Flip.Services DLLには12種類のサービスがあります(20を超える可能性があります)。私のFlip.Domain DLLのモデル、モデル部分クラス拡張、リポジトリクラスと流暢な拡張メソッド、Flip.Utilityの暗号とビジネスサポートクラス、Flip.MainのWebサイト。論理的に思える? – Alex

+0

名前空間はまあです。アセンブリ全体をプログラムなしで更新し、コードを再利用できるようにするには、アセンブリを使用します。しかし、あなたが1つのアプリケーションまたは小さな機能を共有している場合は、すべてをまとめておきます。 – Spence

0

手順を分けて、各プロジェクト(FM、FS、FD、FU)の識別子を作成してください。ページ上の公開されているそれぞれのプロシージャを一覧表示し、そのプロジェクトがプロシージャを使用している場合は、そのプロジェクトの識別子を追加してください。

次に、どのプロジェクトにどのプロシージャが必要かを確認できます。

希望に役立ちます!

+0

私が上記に書いたように、問題は2つのプロジェクトがお互いに気づく必要があることが多いということです。あなたのアプローチはそれをどのように解決しますか? – Alex

+0

提案を試してみると、あなたの手続きの中には、最も適したプロジェクトにないものがあることは間違いなくあります。後のモジュール化のレベルに応じて、言語管理が完全に最適であることがわかります。 –

0
  1. Flip.Servicesにローカライズされた電子メール文字列を配置することができます。欠点は、ローカライズされたリソースを維持するための2つの場所があることです。リソースを編集する場所を最小限に抑えるために、すべてのリソースに対して個別のdllを持つこともできます。
  2. 流暢なインターフェイスを他のdllに移動するか、ドメインのCustomerSearchFilterを作成する必要があります。
  3. プロジェクトを追加したり、構造を再配置したり、名前空間を使用して区切りを作成する必要があります。
+0

ドメインの一部であるCustomerSearchFilter(およびデータ表現を持たない他のビジネスオブジェクト)を通常の処理と見なしますか? – Alex

0

インターフェイス/契約ではなく、具体的な実装の建物のようです。 Imaが提案するように、特定のクラスが何をすることができるべきかを記述するインタフェースを定義することを提案している。プロパティ、パラメータなどを宣言するときにこのインタフェースを使用します。インタフェースを実装と分離したままにしておき、実装を使用するプロジェクトとインタフェースを使用するプロジェクトの両方でインタフェースプロジェクトを参照できます。

あなたは、ドメインの「ティア」で側

+0

このようなプロジェクト構造の例題記事などがありますか?これは共通ですか? – Alex

0

としてテストしやすいコードを作成する依存性注入を使用しての素敵なオプションを取得し、リポジトリおよびサービスは、ドメイン上に、同じ論理レベルで暮らしますインフラストラクチャの役割で私は、ドメイン自体の外であなたのリポジトリの実装(クエリなど)を移動することをお勧めします。それは少なくとも#2を解決する。

+0

これはどんなプロジェクトですか? (専門用語?) – Alex

関連する問題