gpt4 book ai didi

c# - Linq to Entities - 三层架构

转载 作者:太空狗 更新时间:2023-10-29 21:51:49 26 4
gpt4 key购买 nike

在过去的几个月里,我学到了很多关于 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();
}
}

2) 使用“使用”

public class Repository : IRepository
{
public IList<Entity> GetEntities()
{
using (Datacontext context = new Datacontext())
{
return (from e in context.Entity
select e).ToList();
}

}
}

3) 另一种方式(请评论)

我会把你的建议放在这里供其他人评论


似乎有些人说存储库应该向业务层返回一个 IQueryable,而其他人则说最好返回一个 IList。您对此有何看法?


上面第一个问题的代码示例都是指向Repository,但是在businesslayer中实现repository的最佳方式是什么(在构造函数中初始化,使用“Using”??)

最佳答案

我认为两者都可行。最主要的是你应该让你的对象上下文相当短暂(恕我直言)。因此,我认为您有两个选择:-

  1. 在单个方法调用中创建/销毁上下文,例如按照你的第二个例子使用语句。

  2. 在创建/销毁存储库时创建/销毁上下文 - 在这种情况下,您的存储库应实现 IDisposable 并将其自身包装在 using 语句中,并且应该是短暂的。这种方法的好处是你的存储库方法只是做查询,没有使用 (new ObjectContext()) 污染方法;另一方面是将可存储性传递给客户端以处置存储库。使用此机制意味着您还可以在 IQueryable<> 中编写查询(前提是您在处理存储库之前执行查询)。例如:

公共(public)类存储库:IDisposable{ DataHubContext context = new DataHubContext();

public IQueryable<Payment> GetPayments()
{
return context.Payments;
}

public void Dispose()
{
context.Dispose();
}

格式化在 SO 中变得有点滑稽 - 抱歉....然后在你的调用代码中:-

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...
}
}

关于c# - Linq to Entities - 三层架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6649393/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com