12

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 コンテナーの手に委ねようとしていましたが、実際には一歩後退したと思います。どちらの実装についてもどう思いますか?

4

1 に答える 1

3

通常、IoCコンテナに可能な限り処理させるのは良いことです。Webでは、作業単位パターンは通常、要求の開始時に初期化され、終了時にコミットされます(例外がある場合はロールバックされます)。このようにして、リポジトリはunitofworkの代わりにコンストラクターでISessionを取得します。このように、リポジトリはコミットなどを処理する必要がなく、自動的に処理されます。

于 2010-01-18T11:36:31.227 に答える