2013-04-04 58 views
0

我是一個15歲的應用程序的新手。團隊負責人已經開始使用Entity Framework +以及現有的WebForms + Sprocs。在POCO對象中存儲DbContext參考可能會產生哪些問題?

EF中的一些POCO(域實體)具有包含對DbContext的引用的屬性,通常是對象圖頂部的父對象。當我試圖編寫測試時,我不斷得到Context Disposed異常。

public EmployerService(int UserID, Entities entities) // business layer 
    { 
     this.UserID = UserID; 
     _entities = entities; 
    }   


    internal Employer CreateEmployer() 
    { 
     Employer employer = _entities.Employers.Create(); 
     employer.MasterItem = _entities.MasterItems.Create(); 
     employer.MasterItem.LastModified = _entities.ItemLastModifieds.Create(); 
     employer.DBContext = _entities; 
     ... 
     return employer; 
    } 

更重要的是,項目引用並不乾淨。 POCO引用數據和業務邏輯層。我正在構建一個案例來獲取POCO對象的DbContext引用,但是我的搜索剛剛開始。

所以我的問題是,什麼樣的設計原則支持或拒絕引用POCO的DAL層?

+0

這看起來還不錯。它看起來更像是一個上下文生命週期問題(上下文存在時間過長)。在域實體中是否也有對上下文的引用? (就像'僱主'本身)。 _那會很糟糕。 – 2013-04-04 07:08:46

回答

1

您的DAL層潛入業務邏輯層。服務現在與Entity Framework緊密結合(順便說一句,我認爲將EntityFramework.dll引用添加到您的域項目中並不是好主意)。考慮我們正在轉向NHibernate。你應該改變什麼?每個人都會認爲這是一個DAL任務。但請等一下,我的域名中有一些DAL!我們應該改變EmployerService類。

因此,讓您的域名實體永遠無知。特別是讓他們不知道你正在使用的具體持久性技術。我認爲僱主創造的更好的地方是工廠。另外我不明白你爲什麼不在這裏使用簡單的構造函數?看起來你可以在僱主創建期間避免Entity Framework的使用。

+0

它是現有的代碼。我對這個團隊很陌生,並且努力說服他們改變,但是對團隊領導時間的限制使他不想冒險。 – JCii 2013-04-04 06:39:35

+0

@JCii看起來像你的團隊不使用單元測試,現在所有人都在工作。你從他們的目的要求的是簡單的重構,這不會給一些有價值的(當前)好處,但是需要對整個應用程序進行迴歸測試。重構總是很難要求遺留項目 – 2013-04-04 06:46:20

0

vocaldesign principle這裏是你有問題與目前的設計。

DbContext應該作爲short-living使用 - 並不意味着存儲for later。您持有的參考資料並不多,因爲它取得Disposed

至少你應該檢查它是否Disposed(你可以通過覆蓋Dispose來做到這一點,我猜,設置一個標誌或其他東西)。 但如果是這樣,該怎麼辦?

基本上,如果你仍然這樣使用它 - 確保你的POCO對象也是「短命的」 - 但是我確信這會很痛苦。