2011-05-02 62 views
3

我有一個的Windows服務(或Windows窗體),當一個計時器過後,我的服務完成一些任務。實體框架+生活時間+結構圖+工作單元+ Windows窗體?

只要我的應用程序正在運行,我不想僅使用一個實體框架上下文

我看到會話工廠在NHibernate樣本。有沒有像EF

這是我如何使用EF + StructureMapASP.NET MVC或應用

應用程序啓動:

ObjectFactory.Configure(Function(config) config.For(Of IUnitOfWork).HybridHttpOrThreadLocalScoped.Use(Of UnitOfWork)()) 

結束請求:

ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects() 

的UnitOfWork已啓動每個Web請求,並配置請求結束之後。

在我贏應用場景UOW當定時器經過和佈置我的工作是完整的,我不想處理它自己之後應該開始。

我該如何在Windows窗體應用程序中實現這樣的功能?

如果我用我的註冊UOW:HybridHttprThreadLocalScoped有每個線程只是一個UOW,如果我處置它,就不見了

編輯:

我有我的倉庫+服務DLL,我想使用它們兩個網絡還是贏應用,正因爲如此我用HybridHttpOrThreadLocalScoped

更新2:

這裏是我的

Public Class ProductRepository 

    Private ReadOnly _databaseFactory As DataAccess.IDatabaseFactory 

    Public Sub New(ByVal databaseFactory As DataAccess.IDatabaseFactory) 
     _databaseFactory = databaseFactory 
    End Sub 

    Public Function GetById(ByVal id As Integer) As Product 
     Return (From item In _databaseFactory.GetDataContext.Products Where item.ProductId = id).FirstOrDefault 
    End Function 

End Class 

,這裏是我的服務

Public Class ProductService 

    Private ReadOnly _Repository As ProductRepository 

    Public Sub New(ByVal repository As ProductRepository) 
     _Repository = repository 
    End Sub 

    Public Function GetById(ByVal id As Integer) As Product 
     Return _Repository.GetById(id) 
    End Function 

End Class 

而且我使用StructureMap。結構圖需要我的車DatabaseFactoryUoW終身網絡情景。但我不知道贏得應用程序該做什麼。我可以管理自己的生命週期我自己,但我正在尋找一種方式,以便StructureMap將處理它我爲,因爲它處理Web應用程序的生命週期。

+0

Afshin我有類似的問題像你的。你能分享你的最終解決方案嗎? – Shahin 2013-04-08 14:36:00

+0

@shaahin:我目前的解決方案並不完美。我會盡力將它添加到這篇文章儘快。在web應用程序中,請求的開始和結束由框架指示,但在Windows應用程序中不是這樣的,所以我手動進行並且模擬它。例如:在某個按鈕的點擊處理程序方法(在贏取應用程序)中,我正在向自己的基礎結構發出一個請求的開始和結束的信號。 – 2013-04-09 02:41:08

回答

4

ASP.Net提供用於管理您的objectcontext生命週期的基礎設施(基本上每個請求一個httpcontext)。在winforms中顯然沒有類似的東西。因此,管理EF上下文的方式將高度依賴於您的應用程序的體系結構。例如,如果您有MVP或MVVM風格的應用程序,則可以將上下文的生命週期與Presenter或ViewModel的生命週期相耦合。或者你可以選擇一個'用戶故事'的抽象概念,並將你的對象上下文的生命週期和它結合起來。這真的取決於。

爲靈感,look at this article by Ayende(它是關於與NHibernate會話管理,但其概念是相同的。想想NHibernate的會議==實體框架的ObjectContext)

+0

感謝您的回覆。我讀過你提到的文章。問題是:在Web應用程序中,結構圖會爲每個會話啓動並處理我的UoW。在win應用程序中,結構圖會爲每個線程啓動一個UoW,如果我管理它的生命時間並在我的主持人被釋放後處理它,Uow就會消失,但線程仍然活着!我想我應該更多地關注結構圖,正如你所說,它高度依賴於我的應用程序的體系結構。 – 2011-05-03 15:41:22

+0

@Ashshin Gh我不認爲應該由IoC容器來管理uow生命週期,它應該是明確的(至少在桌面應用程序中 – jeroenh 2011-05-11 17:56:54

+0

是的,我找不到更好的方法,看起來我必須管理它我自己在贏取應用程序,我會等待一些其他答案(並投票了你的答案) – 2011-05-11 20:12:10

1

Web應用程序是無國籍,相反桌面應用狀態。在網絡中,對象通常是按照每個請求創建的,並同樣被處理掉。這樣做的原因有很多(如處理多個請求和有限的內存量等),這就是爲什麼您擁有所有基礎架構的原因。在桌面上,您可以將所有內容存儲在內存中。

因此,在桌面應用程序中,您需要手動執行會話管理(通常是每個商業交易)。

UPDATE:this post對會議相關代碼

+0

我完全意識到網絡和贏得應用程序之間的差異在NHibernate中你有Session Factory,什麼是平等的EF? – 2011-05-10 22:48:03

+0

@Ashshin對不起,對於一個毫無意義的答案抱歉。也許你可以看到這篇文章呢?http://peplowdown.wordpress.com/2010/07/05/repository-pattern-in-entity-framework-4-0/這個傢伙在EF裏創建了會話工廠和會話。 – oleksii 2011-05-11 10:36:43

+0

你鏈接的文章並不是我想要的,但它是有用的。我感謝你的幫助,我投了你的答案,我會等待別人投票。並回答。 – 2011-05-11 17:00:15

1

實體框架爲您提供了「語境」,這是一種會話與自身內部工作單元的範圍,對於一個上下文中完成所有的操作仍然是語境的範圍。而實體框架已經實現了Unit Of Work模式。 EF還實現了身份映射,因此對於一個主鍵,您將只能在導航屬性中找到任何引用的唯一對象。

對於桌面應用程序,您只需要維護一個上下文,這將是所有操作的範圍,並將所有操作存儲在正確的狀態直到您調用SaveChanges。

對於Web應用程序,您可以將您的上下文放在Session的Session中。NET,這可能會增加服務器的負載,但它可能允許您存儲更長時間的更改,然後只是一個頁面。

只要我的應用程序正在運行,我不想只使用一個實體框架上下文。

只要應用程序正在運行,上下文有什麼問題?相反,這是做到這一點的正確方法。保持一個上下文並不意味着你保持與活着的數據庫的連接。僅在查詢和保存更改時纔打開和關閉數據庫連接。

如果你的應用程序出現一些不平衡並導致內存問題,最好的辦法是隻分配新的上下文並刷新你的UI,它會把所有舊的上下文和它的對象放入垃圾回收器,你的新上下文將爲你服務內存較少。

+0

只要我的win應用程序正在運行,我不喜歡讓我的上下文保持活躍狀態​​。當我需要時啓動我的UoW並在完成工作後關閉它,對我來說更好。但你是完全正確的,你的答案是有用的。投了贊成票。 – 2011-05-17 18:56:57

+0

ObjectContext並不是一個長壽命的對象。這是不是一個最好的做法,保持它活着(因爲你查詢的所有東西都保持緩存,所以它保持更長時間的機會變得更大,你會看到多用戶環境中的陳舊數據) – jeroenh 2011-05-17 20:39:42

+0

@jeroenh,如果你看我的答案,我並不建議任何人在多用戶環境中長時間保持ObjectContext,對於單用戶來說,最好也是最可取的方法是讓它長期存在,因爲無論如何你都將對象保存在內存中,編輯。 – 2011-05-18 09:04:38