[英]Nhibernate transactions:Avoiding Nhibernate dependency in the service layer
解決這個問題的一種方法是將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.