2011-03-25 9 views
0

私は、EF実装が自分のアプリケーションとどのように対話するかについて2つの方法を考えました。最初のものは単純なリポジトリであり、2番目のものはかなり動的なものです。これらのソリューションはどちらも、SQLプロファイラに基づいて同じSQLクエリを生成します。C# - EF Repository

今、私の質問ですが、解決策2と比較して解決策1のオーバーヘッドがありますか? - そうなら、長期的には重要なのでしょうか?

解決方法1:

public class Repository 
{ 
    public MyContext Ctx = new MyContext(); 

    public IEnumerable<T> GetAll<T>() where T : class 
    { 
     return Ctx.Set<T>(); 
    } 
} 

...そして、それを呼び出すコード:

var rep = new Repository(); 

Console.WriteLine("DEALERS:"); 
foreach(var dealer in rep.GetAll<Dealer>()) 
{ 
    Console.WriteLine(dealer.Name); 
} 

Console.WriteLine("CARS:"); 
foreach (var car in rep.GetAll<Car>()) 
{ 
    Console.WriteLine(car.CarName); 
} 

解決方法2:

public class Repository<T> where T : class 
{ 
    private readonly MyContext _ctx = new MyContext(); 
    private readonly IDbSet<T> _dbset; 

    public Repository() 
    { 
     _dbset = _ctx.Set<T>(); 
    } 

    public IEnumerable<T> GetAll() 
    { 
     return _dbset; 
    } 
} 

...そして、それを呼び出すコード:

var dealerRep = new Repository<Dealer>(); 
var carRep = new Repository<Car>(); 

Console.WriteLine("DEALERS:"); 
foreach(var dealer in dealerRep.GetAll()) 
{ 
    Console.WriteLine(dealer.Name); 
} 

Console.WriteLine("CARS:"); 
foreach (var car in carRep.GetAll()) 
{ 
    Console.WriteLine(car.CarName); 
} 
+0

OT:テーブルに何千(または何万)もの行がある場合、フィルタ/修飾子を使用しないで慎重に使用してください。 – RobS

答えて

1

EFはORMであり、すでにリポジトリパターンを実装しています。独自のリポジトリにラップする必要はありません。

+3

意見が異なります;-) – BrokenGlass

+0

@ Oded - touché... - 私の問題は、いくつかの追加機能が必要だということです。 'GetAll()'を呼び出すときには他のものも必要です。 – ebb

+0

@BrokenGlass - 正確には何ですか?そのEFはORMですか?これはリポジトリパターンを実装していますか?あるいは、ORMをリポジトリにラップするべきではないか? – Oded

0

リポジトリ内で同じセットに少なくとも2回アクセスする必要があります。 は、2つのソリューションが実際に同じように動作するかどうかを確認する必要があります。

2回目の呼び出しでプロファイラを確認し、おそらく動作が同じであることを確認するために、別のコンテキスト、アクセス間で を変更します。

関連する問題