2

プロジェクトで問題が発生しました。Fluent NHibernate と一緒に構造マップを備えた汎用リポジトリを使用しています。すべてがかなりうまく機能しますが、トランザクションとセッション管理に関しては、何をすべきかまったくわかりません。答えを探しましたが、自分のニーズに合ったものは本当に見つかりません。

私がアプリケーションで行っていることは、次のように、リクエストを受け取ったときに構造マップにリポジトリ クラスをインスタンス化させることです。

internal class RepositoryRegistry : Registry
{
    public RepositoryRegistry()
    {
        For<IRepository<User>>().Use<Repository<User>>();
        For<IRepository<Tasks>>().Use<Repository<Tasks>>();
    }
}

internal class NHibernateRegistry : Registry
{
    public NHibernateRegistry()
    {
        For<ISessionFactory>()
            .Singleton()
            .Use(() => new NHibernateSessionFactory().GetSessionFactory());

        For<ISession>()
            .Singleton()
            .Use(x => x.GetInstance<ISessionFactory>().OpenSession());
    }
}

public interface IRepository<T>
{
    T GetById(int id);

    void SaveOrUpdate(T entity);

    IList<T> GetAll();

    IQueryable<T> Linq();

    void Add(T entity);

}

編集:必要なことを結論付けました。構造マップと一緒に作業単位パターンを使用したくありませんが、作業単位を介してアクセスできるある種のリポジトリ ラッパーも必要です。

ありがとう、ジェームズ・フォード

4

1 に答える 1

1

Unit Of Work パターンを探していると思います。トランザクションの有効期間は、リポジトリ/サービスに注入する作業単位によって制御されます。

NHibernate と StructureMap を使用した UoW のサンプル実装については、この回答を参照してください。

編集:

Unit of Work と汎用リポジトリを実装している場合、基本的には次のように使用します。

1) 構造マップでそれらをマッピング:

c.For(typeof(IRepository<>)).Use(typeof(Repository<>));
c.For<IUnitOfWork>().Use<UnitOfWork>();

2) コントローラーにリポジトリー (またはリポジトリーをカプセル化するサービス。このアプローチが好まれることが多い) と UnitOfWork を受け入れさせる:

public class MyController
{
  public MyController(IRepository<MyEntity> repository, IUnitOfWork uow)
  {
     _repository = repository;
     _unitOfWork = uow;
  }
}

もちろん、これにはカスタムの ControllerFactoryを作成しておく必要もあります。

3) コントローラーアクションで Unit of Work と Repository を使用する:

public ViewResult MyAction(MyEntity entity)
{
  _repository.Save(entity);
  _unitOfWork.Commit();
  return View();
} 
于 2011-03-25T08:50:35.727 に答える