2013-11-15 80 views
3

我創建具有下列層的WPF應用程序:實體框架 - 我該打電話的DbContext從BLL或DAL

UI(查看+的ViewModels) - > BLL - > DAL

所有這一切,參考域模型層。

此刻,我通過BLL將所有數據庫調用從UI傳遞到DAL。 但我不確定這是否正確。

大部分在BLL的方法是這樣的:

public ICollection<User> GetUsers() 
{ 
    return dbAccess.GetUsers(); 
} 

這反過來又調用在DAL類似的方法:

public ICollection<User> GetUsers() 
{ 
    using (var context = new DbContext()) 
    { 
     return context.Users.ToList(); 
    } 
} 

1)輸送從BLL到調用此方法DAL似乎相當多餘。當然,有些BLL方法實際上有一點業務邏輯。我應該拋棄BLL嗎?

2)這種方法的另一個問題是我不能使用延遲加載,因爲DbContext是在DAL中創建和處理的。我猜這可以通過在ViewModel中創建DbContext來解決,但是什麼時候應該處理它呢?

3)最後,因爲我沒有使用延遲加載,我不得不加載我的相關實體。 但並非所有視圖都需要相同的相關實體,所以我通常會得到幾個返回相同實體但包含不同的實體的方法。這可以嗎?

X)我所有的數據庫方法都存在於一個名爲DbAccess的大型類中。爲我的每個ViewModel(或者每個實體)創建一個DB服務類會更好嗎?

回答

1

可能直接從BL中調用EF方法,但這會將BL與EF綁定得太緊。如果您編寫單獨的DAL訪問EF,則可以替換整個DAL而不觸及BL,如果您直接從BL調用EF,則這是不可能的。

您也可以使用的DbContext每一個的HttpRequest像這樣下面

public static class ObjectContextPerHttpRequest 
{ 
    public static MyEntities Context 
    { 
     get 
     { 
      string objectContextKey = HttpContext.Current.GetHashCode().ToString("ObjectContextPerHttpRequest"); 

      if (!HttpContext.Current.Items.Contains(objectContextKey)) 
      { 
       HttpContext.Current.Items.Add(objectContextKey, new DomainModel.MyEntities()); 
      } 

      return HttpContext.Current.Items[objectContextKey] as MyEntities; 
     } 
    } 
} 
+0

BLL和DAL之間的解耦肯定是一個優勢。在HttpRequest上不確定SilverLight是否具體?這將對應於WPF中的ViewModel嗎? – msp1982dk

+0

對不起,沒有注意到它是WPF,我只是假設它是MVC。真的不知道WPF和EF如何一起工作。 –