2012-02-16 10 views
1

私のASP.NET MVC 3アプリケーションでは、今のところORMフレームワークとしてEF4.3を使用しています。私は将来必要になったときにそれを代用する能力を持ちたいと思っています。これは、EFの場合にDbContext実装を指すインタフェースの定義を必要とします。ORMプロバイダの抽象化

クエリ可能オブジェクト用のインターフェイスでは何を定義しますか?

私のインターフェイスに::私は次のことをするつもりですが、それは行くための正しい方法かどうかわからない私の場合、例えば

私DbContextで

IQueryable<AnonymousUser> AnonymousUsers { get; } 

    int SaveChanges(); 

public DbSet<AnonymousUser> AnonymousUsers { get; set; } 

    IQueryable<AnonymousUser> IThoughtCatStorage.AnonymousUsers 
    { 
     get { return AnonymousUsers; } 
    } 

ご覧のとおり、IQueryableを使用すると、DbSetsを抽象化することができます。

これが最善の方法ですか? (これはむしろディスカッションのように聞こえるが、現状ではORMアクセスインターフェイスを定義するためのより一般化された方法があるかどうかを知りたいだけだ。)

+3

おそらく良い考えではありません:http://stackoverflow.com/questions/1699607/asp-mvc-repository-that-reflects-iqueryable-but-not-linq-to-sql-ddd-how-to- que/1699756#1699756 –

+1

抽象化の価格は単に高すぎるかもしれません:http://ayende.com/blog/4567/the-false-myth-of-encapsulating-data-access-in-the-dal –

答えて

1

これまでのところ、 :

Faking your LINQ provider part 1

+0

Stevenあなたの記事は私に1時間ほど読んで考えさせてくれました。私はアーキテクチャの部分を理解しましたが、Linq To SQLとUnit Testingの知識が不足しているため、私の個人的なプロジェクトにこれが必要なので、提案されたアプローチが私にとって大きなオーバーヘッドになる可能性があります。しかし、おそらく、時間があるときには、DbContext(EF4コードファースト)を使ってDataMapperの実装を記述することができますか? –

1

どこでもあなたのOR/Mを使用しないでください。 OR/Mを抽象化し、コードの単体テストを容易にするために、リポジトリクラスを使用します。また、コードの重複を排除し、将来的にコードを管理しやすくします。

将来的にOR/Mを切り替える必要がある場合は、リポジトリクラスを変更するだけで済みます。

私たちはすべてOR/Mを理由(あなたのお気に入りのOR/Mが持つ機能)で選択することを忘れないでください。一般的なOR/M層の後ろのOR/Mを抽象化することによって、それらの機能を使用する可能性も取り除きます。

+0

私はあなたに同意します。私が指している記事では、LINQが漏れ抽象であることを説明します。 OR/M実装(EFからAzureへの切り替えなど)を本当に交換したい場合は、IQueryableをリポジトリクラス外で使用することはできません。 – Steven