2010-04-02 54 views
0

我覺得我陷入了僵局。我有一個從頭開始使用FluentNHibernate(ORM)/ SQLite(文件db)構建的應用程序。我決定實施工作單元和存儲庫設計模式。我處於一個需要考慮最終遊戲的階段,該遊戲將以WPF Windows應用程序(使用MVVM)開始,並最終實現作爲UI的Web服務/ ASP.Net。FluentNHibernate工作單元/知識庫設計模式問題

現在我已經爲ORM創建了域對象(實體)。而現在我不知道如何在ORM之外使用它。關於它的問題包括:

  • 我應該直接使用ORM實體對象作爲MVVM中的模型嗎?如果是,我是否在這些實體對象中放置了業務邏輯(例如某些值必須是正數,並且大於另一個屬性)?這當然是更簡單的方法,我現在正在傾斜。但是,是否會有一些垃圾郵件會破壞這個計劃?
  • 如果上面的答案是否定的,那麼我會創建一組新的類來實現業務邏輯並將它們用作MVVM中的模型嗎?我將如何處理模型對象和實體對象之間的轉換?我想一個類型轉換器的實現將在這裏很好地工作。

回答

3

要回答你的問題的第一部分,是的,你的業務邏輯和驗證應該在你的實體中進行。 NHibernate的要點是讓你設計你的實體是持久性的無知。這意味着,只要有可能,就應該像在不關心持久性的情況下那樣設計實體。這是不完全可行的,因爲你很快就會發現(你需要使你的屬性虛擬以支持延遲加載,並且如果你想使用NHibernate Validator,你將用驗證屬性裝飾你的屬性),但在大部分情況下,NHibernate在保持你的方式方面做得很好。

至於是否使用你的實體作爲模型,你會得到混合的評論。理想情況下,您將創建單獨的視圖模型類並將其從您的實體映射到視圖模型,以便您的視圖只能訪問他們所需的最少信息。這在防止N+1 access issues方面也有很長的路要走。然而,這樣做往往是一個巨大的痛苦。當然,有像AutoMapper這樣的工具可以讓您更輕鬆地將您的實體屬性轉換爲視圖模型。

+0

我不知道AutoMapper,謝謝!有了它,創建單獨的ViewModel類並使用AutoMapper將其屬性映射到Entity類屬性是非常有意義的(並且非常有效)。簡單的扁平化可能會起作用(或小投影)。 我知道的第二部分很狡猾,並且需要有堅實的NHibernate/Unit of Work設計模式知識的人。如果你想刺激一下,我會很感激! – Echiban 2010-04-03 00:20:04

+0

是的,我不太熟悉NHibernate告訴你如何最好地設置它。對於它的價值,我已經看到了很多不同的方式來設置ISessionFactory,ISession和ITransaction。就我個人而言,我喜歡直接與這些工作並將ISession傳入需要使用Inversion of Control容器的Repository類中。至於設置它,我會放棄FluentNHibernate文檔,因爲它非常精簡,並且不會增加工作層單元的複雜性。 – 2010-04-03 00:59:27

+0

我向你推薦CodeCampServer(http://code.google.com/p/codecampserver/)。有一個很好的實現使用NHibernate,AutoMapper和IoC(StructureMap) – Rookian 2010-04-05 10:42:10