5

最近我開始深入研究Repository Patterns和UnitOfWork的概念,並探索EntityFramework。EF,UoW和倉庫 - 何時在WebForms中處理UnitOfWork?

由基於MVC的例子我自己的實現,在那裏他們被從控制器配置的的UnitOfWork像這樣:

protected override void Dispose(bool disposing) 
{ 
    unitOfWork.Dispose(); 
    base.Dispose(disposing); 
} 

我沒有把MVC所有,並在Web表單相當新的爲好,但我認爲他們正在重寫Controller配置方法,以便將UnitOfWork作爲其他配置的「所有」處理。

基本上我想在我的ASP.NET WebForms網站中實現相同的概念,並將在頁面代碼後面使用的UnitOfWork與處理頁面本身一起部署。

我曾考慮過將生命週期中的事件添加到Page_Unload事件中,但我不確定這是否是正確的方法,因爲我之前沒有遇到過這樣的事情。我的想法如下:

protected void Page_Unload(object sender, EventArgs e) 
{ 
    unitOfWork.Dispose(); 
    base.Dispose(); 
} 

我該如何實現這一目標,並且我在正確的軌道上?

+0

可能的重複:http://stackoverflow.com/questions/2750111/when-to-call-dispose-in-entity-framework http://stackoverflow.com/questions/4295975/repository-pattern-in-實體框架4當應該我們處置http://stackoverflow.com/questions/10777630/questions-about-entity-framework-context-lifetime http://stackoverflow.com/questions/1698628/entity- framework-and-object-context-lifetime-in-asp-net-mvc –

+0

謝謝你指出這些,他們可能會幫助有更深層次知識的人,他們只需要一些信息來實現他想要的東西。不幸的是不是我。 – Peter

+0

其實,他們是這樣的,你和其他人可以檢查問題是否與那些問題相同,如果這樣的話可以關閉這個問題。任何問題的答案都不能幫助你嗎? –

回答

4

首先:不要發明車輪。

使用依賴注入框架,如:StructureMap,Ninject,團結,等等....

UOW應該用web請求年初開始佈置請求結束

換句話說:當請求開始時,EF的DataContext應該被初始化。然後,您可以將它存儲在某個地方(Session,...),並且可以重用該請求。 每個請求一個DataContext實例。

但是,如果您自己嘗試自己做,那麼使用依賴注入框架就會出錯,這會讓它變得如此簡單。

該框架可以處理您的DataContext(UoW)的生命週期

+0

謝謝你的回答,我正在深入研究依賴注入框架,這對我來說目前是一個完全陌生的框架。我會把這個打開一點,直到我完成研究,也許有人有東西要補充。 – Peter

+0

當然。因爲我非常喜歡這些主題,所以我想聽取其他人關於這些問題的意見。 –

+0

好的,我開始自己初始化UnitOfWork。我注意到BeginRequest事件也觸發了所有靜態文件,這導致了UoW的重複和不必要的初始化。 DI框架會爲我解決這個問題(Webforms)嗎? 另一個解決方法是什麼? – Peter

2

你應該將你的軟件放到層和組件...

UI - >控制器 - >服務 - > DAL

例如

UI.Submit - > Controller.SaveUserInfo - > UsersManagementService.SaveUserInfo - >

public void SaveUserInfo(User user) 
{ 
    using (var uow = new Uow()) 
    { 
     var dbUser = uow.Users.GetByKey(user.Id); 
     if (dbUser == null) 
     { 
      // TODO: 
     } 

     dbUser.Name = user.Name; 
     dbUser.Address = user.Address; 
     // Or use a framework for injecting properties 

     uow.SaveAndAcceptChanges(); 
    } 
} 

可以甚至接收查詢邏輯在certiain服務方法例如

public User GetUsersMatching(Func<IQueryable<User>, IQueryable<User>> query) 
{ 
    using (var uow = new Uow()) 
    { 
     var users = query(uow.Users).ToList(); 
     return users; 

     // For this to work using POCOs you may need to disable proxy creation 
    } 
} 

然而,這使得測試更加複雜,需要服務的消費者瞭解LINQ的侷限性和最佳實踐的實體。

我還建議不要使用純學術庫每鹼型圖案,如經常有效消耗不同類型的數據從同一域需要跨「庫」的查詢和需要在join子句您的或者將多個查詢的結果組合在一起並重新整形,然後將其作爲一個乾淨的結果返回。

將您的服務視爲可以獲得各種類型輸出的域特定庫。換句話說,在你的MVC下面和EF之上使用SOA。