0

假设我有以下类Customer.cs、上下文OfficeContext.cs和存储库OfficeRepository.cs。知道上下文使用连接对象,因此建议将其包含在using语句中:

public List<Customer> GetAllCustomersWithOrders()
{
   using(var oContext = new OfficeContext())
   {
      //Code here....
   }
}

我的问题是,如果我想重用存储库中已经存在的一些代码怎么办?例如,如果我想显示所有订购产品但尚未收到产品的客户,我需要复制代码吗?

public List<Customer> GetCustomersNotReceiveProducts()
{
  using(var oContext = new OfficeContext())
   {
      //Re-use GetAllCustomersWithOrders() here???...
   }
}

但是正如你所看到的,每次访问一个方法时,我也会打开实例化一个新的上下文对象。有什么办法可以处理吗?

4

1 回答 1

1

我所做的是让我的存储库实现 IDisposable。

然后有两个构造函数(一个默认值)来实例化一个新的上下文,将其保存为类级变量。还有另一个构造函数,它接受一个上下文并在内部使用它。

在处理类时,上下文被处理(如果当前存储库实例化了它)。

这会将上下文移出方法级别并将其移至类级别。我的函数将所有内容都保存在 IQueryable 中,因此一个函数可以调用另一个函数并在它命中的数据库之前执行额外的改进。

示例:

public class MemberRepository : IDisposable
{
  OfficeContext db;
  bool isExternalDb = false;

  public MemberRepository()
  {
    db = new OfficeContext();
    isExternalDb = false;
  }

  public MemberRepository(OfficeContext db)
  {
    this.db = db;
    isExternalDb = true;
  }

  public IQueryable<Member> GetAllMembers()
      {
        var members= db.Members

        return members;
      }

  public IQueryable<Member> GetActiveMembers()
  {
    var members = GetAllMembers();
    var activeMembers = members.Where(m => m.isActive == true);
    return activeMembers;
  }

  public void Dispose()
  {
    if (isExternalDb == false)
    {
      db.Dispose();
    }
  }
}

然后在我使用存储库的地方,我在那个级别使用:

using(var memberRepository = new MemberRepository())
{
   var members = memberRepository.GetActiveMembers();
}
于 2013-05-06T15:54:33.447 回答