2010-12-13 78 views
2

我需要一些建議,我們如何解耦表示層中的nHibernate依賴關係。目前,我們有一個三層C#winforms應用程序,包括(簡化)以下層次;C#NHibernate體系結構,三層應用程序

  • 用戶界面(UI)
  • 業務邏輯(BAL)
  • 數據訪問邏輯(DAL)

我們這個應用程序遷移到一個ORM(NHibernate的),並會非常喜歡只有DAL引用nHibernate。我們還希望採用nHibernate中包含的「工作單元」功能,採用「每會話會話」方法。

爲了達到這個目的,我們需要在UI中創建並打開一個會話,將會話通過BAL傳遞給DAL,但是如果不在BAL和DAL中創建對nHibernate的依賴關係,我們無法實現這一點。

任何意見,將不勝感激。我們應該如何構建架構以避免在UI和BAL中引用nHibernate。有任何想法嗎?

我還必須補充一點,我們不希望UI也有對DAL的引用。

UI => BAL => DAL

+2

你所要求的並不是真的有道理(雖然我確實明白你在做什麼,因爲我去過那裏)。這可能是可行的,但它可能很難理解實現細節,並且它提供的價值很小。我的建議:允許你的UI層知道NHibernate,但是儘量減少NHibernate在這一層的使用。 – 2010-12-13 09:44:51

回答

1

看看在NHibernate 3.0 Cookbook我發現它越來越交手與NHibernate非常有用。

您將需要提取實體並創建POCO(普通舊CLR對象)。你的UI不需要任何關於NHibernate的知識。您將在數據層中創建方法來操縱數據。

0

我最近建立了一個在asp.net mvc應用程序中使用nhibernate的解耦架構的示例。它使用存儲庫模式和單獨的工作單元。這些概念中的大多數應該也可以在一個胖客戶端中重用。以下是我的博客上的搜索鏈接,其中可能有趣的帖子。

http://blog.bobcravens.com/?s=Nhibernate

希望這可以讓你開始。如果您有任何問題,請告訴我。

鮑勃

+0

感謝鮑勃,只是通過你的博客閱讀http://blog.bobcravens.com/2010/06/the-repository-pattern-with-linq-to-fluent-nhibernate-and-mysql/,我注意到你的測試層需要對NHibernateHelper有一個依賴。由於測試項目類似於UI層,您是否說UI層需要引用ORM項目,在我們的案例中,這是DAL。 – Josata 2010-12-13 00:40:59

+0

我使用IOC容器創建回購站的nhibernate實例。這是在應用程序啓動時完成的。這是唯一引用nhibernate庫的類。該應用的所有其他區域都引用了repo界面。重要的是nhibernate特定的代碼被隔離到一個區域。 – rcravens 2010-12-13 00:55:53

+0

如果您將IoC容器配置爲通過反射調用的單獨類庫(「GuyWire」模式),那麼即使是從UI層到NH庫的單一引用也可以消除。 – 2010-12-13 11:53:56

2

不可能這樣做的,因爲的UnitOfWork模式由NHibernate的Session對象實現。 但是,您只想從您的DAL引用NHibernate,因爲您的DAL不知道應用程序的上下文,因此使用UnitOfWork時此上下文是必需的。