2009-05-29 14 views
0

Greetings、 遅延ロードを許可する要求によってコンテキストを開いたまま、Entity Managerへのアクセスを提供する最善の方法をソートしようとしています。私は、次のような例をたくさん見ています:ASP .NET MVSのエンティティマネージャへのアクセス

public class SomeController 
{ 
    MyEntities entities = new MyEntities(); 
} 

私は、このセットアップを参照の問題は、あなたがあなたに電話をしたいビジネスクラスの層を持っている場合、あなたは合格する必要が終わるということですそのように、これらのメソッドへのパラメータとしてマネージャ:

public static GetEntity(MyEntities entityManager, int id) 
{ 
     return entityManager.Series.FirstOrDefault(s => s.SeriesId == id); 
} 

はもちろん、私は、良い、スレッドセーフな方法を探していますが、それを通過することなくメソッドにEntityManagerを提供します。方法はまた、ユニットテスト可能である必要があります、セッションでそれを入れて私の以前の試みはユニットテストのために働かなかった。

エンタープライズレベルのアプリケーション用のASP .NET MVCでEntity Frameworkを処理する推奨方法を実際に探しています。

答えて

1

リポジトリパターン(LinqからSQLへのRepositoryのwrite up)を見てください。

静的クラスを作成する代わりに、リポジトリのバージョンをインスタンス化するという基本的な考え方があります。 EntityManagerをコンストラクタ内のクラスへのパラメータとして渡すことができます。それは、マネージャの作業ユニットのインスタンス化を行うことができるように、クラスのEntityManagerを作成できるファクトリです。

MVCの場合、ベースコントローラクラスを使用します。このクラスでは、エンティティマネージャファクトリを作成し、それをクラスのプロパティにして、派生クラスがそのクラスにアクセスできるようにすることができます。渡されたインスタンスがnullの場合、コンストラクタから注入されることを許可しますが、適切なデフォルトで作成されます。コントローラメソッドがリポジトリを作成する必要があるときはいつでも、このインスタンスを使用してリポジトリに渡して、マネージャが必要なものを作成できるようにします。

このようにして、静的メソッドを削除し、単体テストでモックインスタンスを使用できるようにします。インタフェースを実装するインスタンスを作成するはずのファクトリを渡すことで、実際のマネージャクラスからリポジトリを分離することができます。

+0

あなたの考えは私が望むものに近いです。しかし、Entity Managerを使用する必要があるビジネス層には、Entity Managerが公開されていません。しかし、私はあなたが私に正しい方向に微笑を与えてくれたと思う – xximjasonxx

2

Entity Frameworkのv1.0のは、Windowsに優れ事前に

おかげであなたは限り、あなたは好きなようにするためにオブジェクトコンテキストを使用することができますフォームアプリケーション。 asp.netとmvcでは、特に少し難しいです。これに対する私の解決策は、リポジトリまたはエンティティマネージャをMVCが通信できるサービスにもっと似せるようにすることでした。私は一種のgeneric all purpose base repositoryを作成しました。私はそれが好きで、それを正しく行うことについてあまり気にしなくなったときにいつでも使用できました。私は、Webアプリケーションで絶対に必要とされるよりも長いmsでもオブジェクトのコンテキストを開いたままにしないようにしようとします。

EF4をご覧ください。私は、EFをベータ0.75やこれに類するもので、実際には「ハードワーク」を除いて実際の問題がないときに、プロダクション環境で使用し始めました。

0

ビュー内のエンティティを遅延ロードしないでください。ビューでビジネスレイヤーコールを作成しないでください。ビューがコントローラの前で必要とする全てのエンティティをロードし、コントローラがビューの前で必要とする総和と平均を計算します。

+0

私は人を知りません。重複したコードのように思えます。特に、管理者セクションと匿名セクションがある場合はそうです。 Get *コードを中央の場所に集中させる方がいいでしょう。私が戻す方法を変更する必要があるからです。1つの場所でのみ行うのであれば、私は集約ロジックについてあなたに同意します – xximjasonxx

+0

automapper(http://www.codeplex.com/AutoMapper)を使用して、送信するDTOのプロパティに必要なドメインの部分をマップしますビューに。 – yfeldblum

関連する問題