Jul*_*ian 6 c# linq-to-entities dao 3-tier
在过去的几个月里,我学到了很多关于Linq-To-Entities和带有DAO/DAL/Repository的3层架构.现在我脑子里有一些让我烦恼的事情.我将在下面看到这三个问题.
有很多方法可以使存储库工作,但是以何种方式使存储库以性能的方式工作.
1)在构造函数中初始化datacontext
public class Repository : IRepository
{
private Datacontext context;
public Repository()
{
context = new Datacontext();
}
public IList<Entity> GetEntities()
{
return (from e in context.Entity
select e).ToList();
}
}
Run Code Online (Sandbox Code Playgroud)
2)使用"使用"
public class Repository : IRepository
{
public IList<Entity> GetEntities()
{
using (Datacontext context = new Datacontext())
{
return (from e in context.Entity
select e).ToList();
}
}
}
Run Code Online (Sandbox Code Playgroud)
3)另一种方式(请评论)
我会在此提出您的建议供其他人发表评论
此外,似乎有些人说存储库应该向业务层返回IQueryable,而其他人则认为返回IList更好.你对此有何看法?
第一个问题中的上述代码示例指向Repository,但是在businesslayer中实现存储库的最佳途径是什么(在构造函数中初始化,使用"Using"??)
我认为两者都有效。最重要的是,您应该使对象上下文的寿命相当短(恕我直言)。因此我认为你有两个选择:-
在单个方法调用中创建/销毁上下文,例如根据第二个示例的 using 语句。
创建/销毁存储库时创建/销毁上下文 - 在这种情况下,您的存储库应该实现 IDisposable 并将其本身包装在 using 语句中,并且应该是短暂的。这种方法的好处是,您的存储库方法只需执行查询,不会使用 (new ObjectContext()) 污染该方法;另一方面是可重复性传递给客户端来处理存储库。使用此机制意味着您还可以在 IQueryable<> 中编写查询(前提是您在处置存储库之前执行查询)。例如:
公共类存储库:IDisposable { DataHubContext context = new DataHubContext();
public IQueryable<Payment> GetPayments()
{
return context.Payments;
}
public void Dispose()
{
context.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
}
格式变得有点有趣 - 抱歉......然后在你的调用代码中: -
public class ClientCode
{
public void DisplayPaymentsOnScreen()
{
Payment[] payments;
using (var repository = new Repository())
{
payments = repository.GetPayments().Where(p => p.Amount > 100).ToArray();
}
// Do stuff with the data here...
}
}
Run Code Online (Sandbox Code Playgroud)