我已经为我的EF实现与我的应用程序交互的方式提供了两种可能的方法。第一个是简单的存储库,第二个是相当动态的版本。这两个解决方案都根据sql profiler生成相同的sql查询 - 所以仅此而已。
现在是我的问题,与解决方案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 :(得分:1)
EF是一个ORM并且已经实现了Repository模式,绝对不需要将它包装在您自己的存储库中。
答案 1 :(得分:0)
您需要在每个存储库中至少访问同一个集合两次, 看两种解决方案是否真的相同。
在第二次调用时检查分析器并可能更改数据 通过另一个上下文,在访问之间,以确保行为是相同的。