我正在尝试将我的域模型尽可能地写成持久性无知。我现在唯一要做的就是标记每个属性和方法virtual
,因为 NHibernate 要求延迟加载。
在我的域模型程序集中,我定义了一些存储库接口:
public interface IRepository<TEntity> where TEntity : EntityBase {
TEntity Get(int id);
/* ... */
}
public interface IProductRepository : IRepository<Product> { ... }
然后我有一个数据汇编。这个将引用 NHibernate,它知道它的存在。这是实现这些存储库接口的程序集:
public abstract class Repository<TEntity> : IRepository<TEntity> {
public TEntity Get(ind id) { ... }
/* ... */
}
public class ProductRepository : Repository<Product>, IProductRepository {
/* ... */
}
等等。
现在我想为我的存储库实现一个事务功能。为此,我将BeginTransaction
在 IRepository 接口上添加一个方法。但是,我不能将它的返回类型定义为NHibernate.ITransaction
,因为我想保持域模型持久性无知,而不是被迫从我的域模型程序集中引用 NHibernate 的程序集。
你会怎么办?
您是否会简单地在接口上实现 a void BeginTransaction()
、 avoid Commit()
和 avoid RollBack()
方法,并让存储库实现在ITransaction
内部管理对象?
或者您会找到一种方法来公开ITransaction
对象以让客户端直接使用它来管理事务,而不是使用存储库的方法?
谢谢!