4

私は一日中座っていた循環参照/依存関係にいくつかの問題があります。私の思考プロセスに何か問題があるに違いありません。

ここに私のプロジェクトがあります:

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 は既にサービス レイヤーに依存しているため、強く型付けされた電子メールやその他のローカライズされたリソースをサービス レイヤーに取得する方法がわかりません。したがって、メイン プロジェクトに依存させることができます。

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個)

特に、他の人は通常循環参照の問題に遭遇しないことを読んだとき、どこかで間違いを犯しているように感じます。ヘルプ?

4

6 に答える 6

5

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

于 2009-08-24T05:33:25.167 に答える
0

ドメインの「層」では、リポジトリとサービスは同じ論理レベルで、インフラストラクチャの役割でドメインの上に存在します。リポジトリの実装(クエリなど)をドメイン自体の外に移動することをお勧めします。それは少なくとも#2を解決します。

于 2009-08-24T06:03:49.613 に答える
0

問題は、名前空間で分離するものと、DLL で分離するものに帰着します。すべてをモジュール化する正当な理由がある場合は、非常に懸命に作業する必要があります。しかし、これらの dll のそれぞれにクラスが 1 つまたは 2 つしかない場合は、それらを 1 つにマージできますか?

于 2009-08-24T05:11:46.020 に答える
0

数分かけて手順を整理します...各プロジェクト(FM、FS、FD、FU)の識別子を作成します。一般にアクセス可能な各プロシージャをページにリストし、プロジェクトがプロシージャを使用している場合は、プロジェクトの識別子を追加します...

次に、どのプロシージャがどのプロジェクトにある必要があるか (またはどのプロジェクトにアクセスできるか) を確認できます。

それが役立つことを願っています!

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

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

次に、依存性注入を使用して、コードをサイドとしてテストしやすくするという素晴らしいオプションを取得します

于 2009-08-24T05:46:10.430 に答える