2011-07-05 4 views
4

私は3層アーキテクチャのプログラムを持っています。質問は次のとおりです。
1.データアクセスはEFのレイヤーですか?
2. Presentation LayerからEFで生成されたエンティティを使用する場合は、データアクセスを参照しますが、これは3つのレイヤードアーキテクチャの原則に違反します。エンティティフレームワークと3層アーキテクチャ

+1

croisharpプレゼンテーションレイヤーまたはモデル定義(クラス)を要求しているHandlersプロジェクト(ロジック)でEFモデルを参照すると、データアクセスはデータレイヤーに残りますので、心配しないでください! – euther

答えて

1

はいEFがデータアクセスレイヤーになります。 EFでは、POCOをサポートするT4テンプレートを使用できます。これらのPOCOを個別のdllに抽出すると、これはすべてのレイヤーからの参照になります。

+0

+1 POCOを使用すると、アーキテクチャーの完全性が維持されることを確実にするために必要なレベルの抽象化が提供されます。の証拠?データアクセスの実装を置き換えても、データコントラクトとしてPOCOを保持することができます。 –

1

あなたはどのようなアプリケーションを構築していますか? ASP.NET MVC 3アプリケーションを構築する場合は、ビューをプレゼンテーション層にし、モデルがデータアクセス(EFを使用できる)であり、コントローラおよび/またはアクションフィルタにビジネスロジックを含めることができます。シナリオでは、プレゼンテーションレイヤーでEFモデルを使用しますが、引き続き懸念の原理を満たします。

+0

私は、netTcpBindingを使用してwcfサービスを構築しますが、provie Webサービスソフトウェアファクトリを持つアーキテクチャを使用します。サービス実装からのデータアクセス、またはプレゼンテーションレイヤーからの他のアプリケーションからのデータアクセスを参照すると、アーキテクチャ上のエラーはありませんか? – croisharp

+0

私は任意の抽象モデルの重要な目標は依存関係を制限することだと思うので、ServiceContractにSQL文があれば、サービス実装はデータアクセスに「あまりにも依存している」と言います。 EFはそれ自体で抽象化を提供します。私がお勧めするのは、EFコンテキストからサービスを抽象化するリポジトリクラスを作成することです。あなたの質問に答えていますか? –

+0

確かに、削除、編集、GetById、GetAll、Addメソッドを実行するManagerで抽象化を行いましたが、それはビジネスロジックです。つまりCustomer、Producerのように生成されたエンティティを意味します... – croisharp

1

EFは二つのことを行います - オプション(あなたのためのドメインモデルを生成しますが、一般的に使用される)

1) 2)は、あなたにそのドメインモデルを経由してデータベースを変更/照会する能力を与えます。

これは、ドメインモデルとデータアクセスの間の線がぼやけて見えることがありますが、2つは実際に別々です。

オブジェクトのコンテキストを作成したり、プレゼンテーションに直接質問を書くなどの作業をしていない限り、IMHOでは抽象を壊すことはありません。あなたが参照する必要があるのは唯一のものですSystem.Data.Jethroが提案したルートを使ってドメインモデルを別のプロジェクトに生成しない限り、プレゼンテーションプロジェクト(実際のアーティファクト)のオブジェクト(またはEF dllが何であれ)になります。

2

マイクロソフトスペインはCodePlexの上のN層アプリケーションのためのかなり良いドキュメント、ガイドとサンプルアプリケーションをリリースし、あなたはここでそれを見ることができます:

http://microsoftnlayerapp.codeplex.com/

あなたは多くの方向とそこに役立つ実装パターンを見つけます。

hth。

0

3層アーキテクチャの場合。私は、プレゼンテーションレイヤーから直接EFを実行するのではなく、ドメインモデルとデータモデルパターンを使用して抽象化を行うことを検討します。

考えられるのは、様々なCRUDのためにこれらのクラスにアクセスする方法を知っているリポジトリを持つEF POCOクラスを持つデータモデルがあるということです。

ドメインモデルには、クライアントに関連するモデルがあります(さまざまなViewModelsや検証関連のコードを入れることができます)。これはWPFまたはMVC Webアプリケーションです。 これらの2つの間に、ドメインモデルとデータモデルの両方に対話するビジネスがあります。

プレゼンテーションレイヤーは、EF /データレイヤー/リポジトリについて何も知らない。新しいデータフレームワークやデータベースを導入したい場合は、新しいリポジトリクラスとデータモデルクラス(ある種のコードジェネレータを使用する)を作成するだけです。

これにより、コードをユニットテスト可能にすることもできます。

関連する問題