簡體   English   中英

Nhibernate事務:避免服務層中的Nhibernate依賴

[英]Nhibernate transactions:Avoiding Nhibernate dependency in the service layer

Nhibernate專家倡導的一種做法是在交易中所有行動。

在典型的3層Web架構中,Nhibernate依賴性受限於數據層。

在這種情況下,使用起來很好

  using (var tr = NHibernateSession.Current.BeginTransaction()) {

在控制器級別。 這不會將Nhibernate依賴於服務層嗎?

解決這個問題的一種方法是將NHibernate會話和事務語義包裝在您自己的抽象接口/實現類中。 這樣,如果你想說,切換到Linq2Sql,你可以創建一個L2S實現。 但是,這仍然意味着事務語義仍將在服務層中,而不是NHibernate特定的調用。 有關如何執行此操作的許多示例,請IRepository<T> Google IRepository<T>

但是,如果您不打算在將來切換ORM,可以說在服務層中使用NHibernate並不一定是壞事,因為NHibernate本身就是對數據層的抽象。

我也希望這樣做,但由於缺乏時間和一些YAGNI尚未確定方法。

這是一些我尚未測試的代碼,但改編自開源的SharpArch項目。 我喜歡這個界面很多,但我可能已經改變了一些NHib實現,因為有些事情我不喜歡SharpArch的存儲庫實現,但你可以自己判斷。

當然使用NHib session.BeginTransaction()引入NHib依賴項,而不是抽象出來似乎與抽象出IRepository和其他所有內容不一致。 我會對你作為有用的交易抽象的結論非常感興趣。

HTH,
Berryl

public interface IDbContext {
    void CommitChanges();
    IDisposable BeginTransaction();
    void CommitTransaction();
    void RollbackTransaction();
}

public class DbContext : IDbContext {
    private readonly ISession _session;

    public DbContext(ISession session)
    {
        Check.RequireNotNull<ISession>(session);
        _session = session;
    }

    public void CommitChanges() { _session.Flush(); }

    public IDisposable BeginTransaction() { return _session.BeginTransaction(); }

    public void CommitTransaction() { _session.Transaction.Commit(); }

    public void RollbackTransaction() { _session.Transaction.Rollback(); }

}

對某些靜態單身人士的呼喚似乎對我來說似乎不是一個好主意。 也許最好在您自己的“ITransactionFactory”上添加依賴項,並將NHibernate特定代碼留在TransactionFactory實現中。

特別是對於SharpArchitecture,有一個TransactionAttribute動作過濾器,用於將您的動作方法包裝在事務中。

關於NHibernate的匯編引用,這不是我個人擔心的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM