NHibernate を使用してリポジトリ パターンをセットアップしています。基本クラスは次のようになります。
public interface IUnitOfWork : IDisposable
{
void Commit();
void Rollback();
}
// generic NHibernate implementation of IUnitOfWork here
public class NHibernateRepositoryBase<T> : IRepository<T>
{
private NHibernateUnitOfWork _unitOfWork;
public NHibernateRepositoryBase(NHibernateUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}
public T Get(object id)
{
return _unitOfWork.Session.Get<T>(id);
}
// ...
}
ご覧のとおり、コンストラクターを介して (StructureMap を使用して) 作業単位を設定できるようにしています。次のように、ASP.NET Web サービスにリポジトリ オブジェクトを設定しています。
[WebService(Namespace = "...")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class ModuleService : System.Web.Services.WebService
{
public IUserAccountRepository UserAccountRepo { get; set; }
public ModuleService()
{
// tell IoC to inject properties
ObjectFactory.BuildUp(this);
}
// ...
}
お察しのとおり、私の問題は、設計上、作業単位のライフサイクルを制御できなくなったことです。以前は、作業単位を状況依存オブジェクトにして、リポジトリは次のような方法でそれへの参照を取得していました。
public class NHibernateRepositoryBase<T> : IRepository<T>
{
public T Get(object id)
{
return NHibernateUnitOfWork.GetCurrent().Session.Get<T>(id);
}
// ...
}
この以前の設計では、using ステートメント内で UnitOfWorkFactory から作業ユニットを作成することで、コード内の作業ユニットのライフ サイクルを制御できました。もっと多くの作業を IoC コンテナーの手に委ねようとしていましたが、実際には一歩後退したと思います。どちらの実装についてもどう思いますか?