什麼時候我會在NHibernate提供的內容上寫一個UoW實現?任何現實世界的例子?爲什麼我會在NHibernate會話之上使用工作單元模式?
回答
你所描述的是已經通過NHibernate的提供工作的單位,所以沒有理由做這樣的單元工作。
我們在WCF服務中擁有的是一個更高層次的工作單元,其中包含我們應用於當前工作單元的重要信息。這包括爲我們抽象NHibernate ISession。當你分解它時,你的代碼可以分爲三類
需要處理Unit Of Work的代碼。誰支持工作單位並不重要。它可能是NHibernate,iBatis或自定義的ORM。所有的代碼需要做的是加載,回滾,保存等。它不會也不應該關心用於這樣做的機制。
需要直接處理ISession的代碼,因爲它正在執行NHibernate特定的事情。通常這與需要創建的複雜查詢有關。
不需要知道它在單元工作中運行或訪問ISession。作爲討論的一部分,我們完全可以忽略這一點。
儘管1.中的代碼可能僅僅針對ISession工作,但我們的首選是試圖在代碼中抽象出我們不直接控制或可能改變的東西。有價值的原因有兩個。
當我們開始時,我們並沒有在NHibernate上100%出售。我們正在考慮iBatis或定製的東西。顯然這不再是一個問題。
整個團隊都不是NHibernate的專家,也不是我們想要的。在大多數情況下,人們編寫符合類別1的代碼,而他們所知的全部是我們的工作單元。當類別2中的代碼必須寫入時,它會被理解爲NHibernate的團隊成員編寫。
所以收我會說,單位的類型的工作,你所談論的,不需要我的建議是工作的一個更高層次的單位可以提供很多價值。
如果您正確設置了所有映射(即級聯),則無需執行任何特殊操作,並且ISession
也可以正常工作。但是,如果您要編寫3層應用程序,則必須手動對想要在單個事務中執行的數據庫操作進行排序。在「企業應用架構模式」福勒的「參考實現」可以是一個很好的起點:
class UnitOfWork...
public void registerNew(DomainObject obj) {
Assert.notNull("id not null", obj.getId());
Assert.isTrue("object not dirty", !dirtyObjects.contains(obj));
Assert.isTrue("object not removed", !removedObjects.contains(obj));
Assert.isTrue("object not already registered new", !newObjects.contains(obj));
newObjects.add(obj);
}
public void registerDirty(DomainObject obj) {
Assert.notNull("id not null", obj.getId());
Assert.isTrue("object not removed", !removedObjects.contains(obj));
if (!dirtyObjects.contains(obj) && !newObjects.contains(obj)) {
dirtyObjects.add(obj);
}
}
public void registerRemoved(DomainObject obj) {
Assert.notNull("id not null", obj.getId());
if (newObjects.remove(obj)) return;
dirtyObjects.remove(obj);
if (!removedObjects.contains(obj)) {
removedObjects.add(obj);
}
}
public void registerClean(DomainObject obj) {
Assert.notNull("id not null", obj.getId());
}
我的工作界面的基本單元包含下列方法 - 初始化 - 提交 - 回滾 - IDisposable.Dispose
我用它了會話和事務管理。 這很有用,因爲我不必一次又一次地爲不同的會話範圍編寫代碼。(每個請求的工作單元,每個請求的系列,每個線程等)
- 1. 在MVVM中使用工作單元設計模式/ NHibernate會話WPF
- 2. 什麼是爲什麼使用會話模式:SQL Server模式?
- 3. NHibernate會話管理/模式
- 4. 會話作用域bean工作在會話線程之外
- 5. NHibernate的工作單元 - 多個會話(WinForms)
- 6. 爲什麼我只能在當前會話上使用blob
- 7. NHibernate和工作單元模式
- 8. 爲什麼使用Facade模式的EJB會話bean
- 9. 爲什麼我的課不會工作?
- 10. nHibernate會話 - 在Web,windows,wcf等中使用存儲庫模式
- 11. 爲什麼在jsp上調用會話會返回錯誤?
- 12. 正確使用nhibernate會話
- 13. 會話vs單例模式
- 14. 爲什麼需要在NserviceBus中將nhibernate會話工廠設置爲ThreadStaticSessionContext?
- 15. Cookie不會在https://工作?爲什麼?
- 16. NHibernate,惰性Loadind和會話作爲Singleton
- 17. 會話數據在使用SQLServer會話模式時消失
- 18. 爲什麼在遠程EJB3會話Bean上使用InitialContext
- 19. 爲什麼GCM不會在某些電話上使用?
- 20. 爲什麼我的單身人士不會工作?
- 21. 爲什麼我們在會話中使用Asp.net中的Cookie?
- 22. 爲什麼我不能在笨鉤使用會話
- 23. 爲什麼我會在WinForm對話框中使用InitializeLifetimeService?
- 24. 在會話中查詢RavenDB索引 - 會話不是工作單元?
- 25. 爲什麼這個簡單的PHP會話不起作用?
- 26. NHibernate會話ObjectDisposedException
- 27. 爲什麼我在Dojo表單中的xhrpost不會打電話?
- 28. 爲什麼我會在HTML元素之間重疊?
- 29. 爲什麼不應該使用密碼作爲會話密鑰
- 30. 爲什麼我在使用虛線域名(example-dashed.com)時會丟失會話?
ShaneC,我有一個類似的問題,聽起來你已經創建了一個比我的更適合我的需求的工作單元。你可以看看我的問題,並提供你的0.02美元? http://stackoverflow.com/questions/2604762/using-unit-of-work-design-pattern-nhibernate-sessions-in-an-mvvm-wpf – Echiban 2010-04-09 20:31:38