2011-07-28 10 views
0

私はエンティティ層、DAL層、ビジネス層、およびUI層で構成される、.NETのN層アーキテクチャを実装しています。プロジェクト構造 - 相互参照レイヤー

エンティティは、プリミティブフィールドに加えて、ナビゲーションプロパティも含みます。この例はInvoiceLineプロパティを持つInvoiceエンティティで、親Invoiceエンティティに関連付けられたすべてのInvoiceLineエンティティを返す必要があります。

これらのInvoiceLinesに適用する必要があるビジネスロジックが永続性メディアから取得され、コードを複製したくないという事実のため、InvoiceエンティティのInvoiceLinesプロパティは、 IEnumerableを返すビジネスロジック内のGetInvoiceLinesByInvoiceIDメソッドに渡します。

は私の問題はこれです - エンティティのプロジェクトは、ビジネスのプロジェクトに依存しており、ビジネスのプロジェクトは、それによって相互参照を導入し、エンティティのプロジェクトに依存するため、私は、別のプロジェクトに層を分離することはできません。私は現在、3つのレイヤー(Entities、DAL、Business)を同じプロジェクトに収めていますが、これはうまくいきますが、他のソリューションの中でEntitiesだけを共有することはできません。

私は、相互参照層によって、このように私はいくつかの原則に違反してることを理解するが、それはそれらに適用されるビジネスロジックと私のエンティティに取り込まナビゲーションプロパティを持つことが非常に便利です。

は、誰もがより良い方法、または私は別のプロジェクトで、私の層を維持しながら、これを行うことができますいくつかの方法を提案してくださいことはできますか?

乾杯

+0

明確にするために、エンティティレイヤーだけをSQLCLRプロジェクトと共有する必要があります。エンティティ、DAL、ビジネスを含む「レイヤー」プロジェクト全体に、SQLCLRでサポートされていない参照アセンブリが多数含まれているため、アセンブリ。良い例えば – Hoodlum

答えて

2

私はこのような状況自分の回数にしてきたし、アウト簡単な方法は、通常はあります。

私はここでいくつかの仮定をしますが、うまくいけば彼らは正しいでしょう。インターフェイスベースのアプローチを使用している場合、ビジネスロジックはいくつかのインターフェイスを実装し、エンティティはいくつかのインターフェイスを実装します。エンティティーからビジネス・オブジェクトへの依存関係は、ビジネス・オブジェクトからエンティティーへのインターフェースのものでなければなりません。これにより、インターフェイスを別のプロジェクト(または2つ)に分割し、ビジネスロジックと具体的なエンティティを独自のプロジェクトに分割して、インターフェイスアセンブリを参照するだけで済みます。

うまくいけばうまくいきます。

+0

、それは私のために意味をなさないだwww.sharparchitecture.net –

+0

SharpArchitectureプロジェクトを参照してください...「あなたは私の現在のプロジェクトのアーキテクチャを記述しているcosを:D – Jonathan

+0

私はあなたが何を意味するかを得ると思う - 私はフィールドを定義した場合自分のエンティティをインタフェースとして使用し、実際のエンティティにこのインタフェースを実装させ、ビジネスレイヤが同じインタフェースを実装するオブジェクトを返すようにすると、それらを分離することができます。 – Hoodlum

関連する問題