仕事の単位とリポジトリパターン
-
20-09-2019 - |
質問
私は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);
}
// ...
}
この前のデザインは、私が使用してステートメント内UnitOfWorkFactoryからの作業単位を作成することによって、自分のコードで作業単位のライフサイクルを制御することができました。私はIoCコンテナの手に作業の多くを入れしようとしていたが、私は実際に後方に一歩を踏み出したと思います。どちらかの実装上のあなたの考えは何ですか?
解決
通常、あなたのIoCコンテナは、できるだけ多くを処理させるために良いことです。作業パターンの単位は、通常、要求の開始時に初期化され、最後にコミットを取得ウェブ上で(任意の例外がある場合はロールバック)。この方法で、あなたのリポジトリには、代わりのUnitOfWorkのコンストラクタでISessionがかかります。この方法で、あなたのリポジトリがコミットまたは何でも、それはあなたのために自動的に処理されますに対処する必要はありません。
所属していません StackOverflow