私は自分のドメイン モデルを可能な限り持続性を考慮しないように書こうとしています。私が現在行っている唯一のことは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()、 a void Commit()、および aメソッドを単純に実装し、リポジトリの実装でオブジェクトを内部的に管理しますか?void RollBack()ITransaction
それとも、リポジトリのメソッドを使用する代わりに、オブジェクトを公開しITransactionて、クライアントがトランザクションを直接管理できるようにする方法を見つけますか?
ありがとう!