2012-08-30 44 views
0

我有一個應用程序,它將具有一些演示層(web,mobile,wpf,wcf,windows服務以在背景上工作等)。我們使用NHibernate來持久化域對象。我們將有存儲庫(類庫)來保存數據,服務層使用這些存儲庫根據業務規則來保存。我的問題是,我們不知道如何在這個服務層實現一個交易管理。我們可能會在同一個服務層方法中使用(多個)存儲庫,並且我們需要控制服務層上的事務。我想實現這樣的事情(由屬性):服務層中的會話和事務處理

public class DomainObjectService 
{ 
    [Transactional] 
    public bool CreateDomainObject(DomainObject domainObject, /* other parameters */) 
    { 
     foreach(var item in /* collection */) 
     { 
      _itemRepository.Save(item); 
     } 

     if (/* some condition */) { 
      /* change the domainObject here */ 
     } 

     _domainObjectRepository.Save(domainObject); 
    } 
} 

而這是否事務屬性控制我的提交/回滾時,我們得到了誤差修改事務。可能嗎?還是有另一種解決方案來做到這一點?

謝謝

回答

3

你問什麼沒有一個簡單的答案。

你想要聽起來像你需要實現一個工作模式的單位的行爲。

NHibernate自己的ISession實際上是一個工作單元的實現。我個人建議實施你自己的工作單元,這樣你就可以更好地控制你的具體應用程序將其視爲一個工作單元。

在服務層類中使用屬​​性對我個人來說確實沒有什麼意義。我已經看到人們在處理事務的MVC應用程序中創建自定義控制器屬性,但我從未親自同意這種實現。

您提到在服務層使用多個存儲庫。這是非常普遍的做法,但這也意味着每個庫都需要在同一個工作單元內運行。如果您的應用程序正在使用依賴注入,那麼一種選擇是讓每個存儲庫在其構造函數中接受一個I​​Session。您所選擇的依賴注入框架可以設置爲將相同的ISession注入到所有存儲庫中。每次創建新的ISession時,您的設置都可以配置爲開始新的事務。

您還提到了不同的表示層,例如web,mobile,wpf等。如何處理這些不同類型的應用程序中的會話和事務可能會有很大的不同。這就是爲什麼我總是將人們指向工作單位的原因,因爲這些不同的應用程序類型對於它認爲的工作單元可能有完全不同的定義。對於Web應用程序,您通常會爲每個Web請求配備一個新的工作單元。對於wpf應用程序,工作單元可以是每個屏幕,或者直到用戶點擊保存按鈕等。另外,通過實現一個工作單元,您可以在不同的應用程序類型之間更輕鬆地重用相同的工作單元。

同樣,這不是一個希望直接回答的問題,但總的來說,我通常使用自定義工作單元和依賴注入框架來使這個問題更容易處理。

這裏有你要調查一些有用的鏈接: