0

我有一個MVC項目,我專門使用模式定製的「工作單位」是在後端使用NHibernate的,我接觸到我的應用程序IUnitOfWorkIUnitOfWorkFactory接口;這些接口是通過Ninject作爲我的NHibernate實現注入的。如何實現會話每會話模式,用的WebAPI/NHibernate的

我在修改後的「每個請求的會話」樣式中使用我的UOW ...當我需要執行數據庫操作時,從注入的IUnitOfWorkFactory中明確地生成我的IUnitOfWork;保留它所屬的CRUD(在我的視圖和控制器之外)更容易,並且有效地防止意外的N + 1編碼問題。當然,實施起來有點困難,但迄今爲止,我對此感到非常滿意。

現在我想實現一個WebAPI呈現IQueryable<Entity>風格的REST調用,而我的UOW模式並沒有挖掘它。 Queryable總是爆炸,試圖調用一個處置的NHibernate會話。

我讀過一些東西,網上有關如何實現一個DelegatingHandler來管理一個呼叫的WebAPI的會話...但我看到幾個問題:

  1. 似乎所有的例子都是假設「 Session per Request「模式......這是迄今爲止最流行的模式,但並不完全是我正在使用的模式,所以我不確定這是否是正確的方向。
  2. 目前還不清楚我是如何爲這些Web API調用專門實現此處理程序的。
  3. 我看到很多建議使用「Session per Conversation」模式,這種模式甚至可能比「Session per Request」模式更長壽命......聽起來這可能適合這種嘗試,但關於的文檔如何來實現它是有點稀疏。
  4. 我看過的所有示例實現都非常緊密地將NHibernate ISession耦合到Web應用程序,使用內置的NHibernate機制(CurrentSessionContext.Bind(ISession));我寧願參考我的界面,並相信它可以維持它所需要的會話。

所以我的問題是,我如何用我自己的IUnitOfWork接口逆着鬆耦合NHibernate的後端實現IQueryable<Entity>的RESTful API?

+0

你曾經看過這個問題呢,使用WebApi的UOW例子? http://stackoverflow.com/questions/15070253/ninject-setup-for-general-repository-using-nhibernate – Rippo

+0

這很有趣,但我不認爲我可以收集我需要的東西。 –

+0

擁抱而不是抽象似乎是人們目前的行爲方式。 – Rippo

回答

1

你會面對同樣的問題,一個簡單的session-per-request實現。例如:

// GET api/companies 
public IQueryable<Company> GetCompanies() 
{ 
    return _session.Query<Company>(); 
} 

我通常包裝所有的數據庫操作,包括選擇,在一個交易,但因爲查詢的執行被延後,我不能做這個方法。可以通過創建一個ActionFilter並重寫OnActionExecuted來實現,但難度在於獲得對過濾器中ISession或IUnitOfWork實現的引用。有一些如何在網絡上使用Ninject和其他依賴注入框架來實現這個功能的例子。

就我個人而言,我沒有看到抽象ISession的價值,特別是在Web API中,它很少有一個資源沒有執行數據庫操作。會話每會話絕對不是一個很好的模式,它通常是指在多個服務器往返中保持會話打開。

我的首選體系結構是使用Ninject來管理ISessionFactory和ISession生存期(分別爲singleton和per-request)並將ISession注入Api控制器。但是,您也可以將其注入到存儲庫或工作單元實施中。

+0

那麼我想抽象'ISession'的主要原因是因爲它聞起來像一個緊密的耦合,其中我的應用程序中的其他所有內容都通過乾淨的接口處理。到目前爲止,我的應用程序根本沒有提及NHibernate ......我想保持這種方式。 –

+0

我想我的答案仍然相關,你可以使用ActionFilter來描述。 –

+0

還有一個答案,將您的Web API移動到另一個終點(實際上是另一個有效的網址),並且擁抱NH而不是抽象。通過抽象,您將失去延遲加載並返回'IQueryable'以供以後使用的能力。這是其中一個「我不會喜歡答案的問題......」你真的沒有多少選擇。 – Rippo