2009-08-24 80 views
1

在几个库之间使用(nHibernate)IT交易的最佳做法是什么?如何处理几个通用库之间的交易

首先在通用接口上创建了一个BeginTransaction(),但是后来我想了解一下这些存储库之间的工作方式?我的意思是如果从存储库中删除了某些东西,然后从另一个存储库中删除了其他东西,但是想要将整个操作包含在事务中。

尽管所有reposistories共享相同的ISession(由DI框架处理),所以我想可以从任何存储库获得ITransaction,然后提交它,并且它也适用于所有其他存储库。

回答

0

我能,而不是把全班通用的,只是让每个功能通用的,就像这样:

public interface IRepository 
{ 
    T Get<T>(int id); 
    T SingleOrDefault<T>(Func<T, bool> query); 
    IQueryable<T> Where<T>(Expression<Func<T, bool>> query); 
    IQueryable<T> All<T>(); 
    void Save<T>(T entity); 
    void Delete<T>(T entity); 
    ITransaction BeginTransaction(); 
} 

但随后的界面或多或少依赖于NHibernate的,无论如何,所以也许它的价值毕竟,实施工作单元模式。

+0

你可以同时做这两件事,或者是你的意思? – Paco 2009-08-24 21:20:44

2

通过不让存储库负责事务管理。 不要直接在存储库中注入ISession,而是使用持有会话并启动并提交事务的工作单元。

INHibernateUnitOfWork 
{ 
    ISession CurrentSession { get; } 
    void Start(); // begins the transaction 
    void Commit(); 
    void RollBack(); 
} 
+0

同意(虽然没有看到该界面的观点)。通常发生这种情况时,您希望IRepository是ORM不可知的,因此您将会话放入构造函数中,但不会与UoW一起使用。因此,无论您是在抽象存储库中构建一些抽象UoW,还是节省了一些时间,只需编写一个ISession代码,这对您来说就是一件很棒的事情。 – anonymous 2009-08-24 20:26:57

+0

是的,我刚刚在这里发现了一个很好的博客文章:http://elegantcode.com/2009/03/25/fubumvc-from-scratch-part-4-persistence/ – 2009-08-24 20:47:43

+0

@eyston:一个好处接口是它可以在其他数据访问场景中使用而不是在仓库中使用。在更复杂的应用程序中,只有存储库模式可能不足以适应任何类型的数据访问。这种类型的工作单元不会使您的存储库ORM独立,它只会使其独立于事务。 @Carl:好博客文章,我使用的工作单元的外观几乎就是这样。 – Paco 2009-08-24 21:08:48