2013-05-06 56 views
0

假設我有以下類別Customer.cs,上下文OfficeContext.cs和存儲庫OfficeRepository.cs。明知情況下使用連接對象,所以建議把它們放在一個使用聲明:EF:如何在使用語句中包含上下文對象?

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

我的問題是什麼,如果我想在存儲庫中已經重新使用一些代碼?例如,如果我想要顯示所有訂購產品但尚未收到產品的客戶,我需要複製代碼嗎?

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

但是正如你所看到的,每次訪問一個方法,我也打開實例化一個新的上下文對象。有什麼辦法可以解決這個問題嗎?

回答

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(); 
}