0

私はDDDを初めて使用するので、初心者です。だから、それは非常に簡単だとしましょう:D私はasp.net mvc 2、ddd、nhibernateを使用してアプリケーションを開発しました。クラスライブラリにドメインモデルがあり、別のクラスライブラリにリポジトリがあり、asp.netmvc2アプリケーションがあります。私のリポジトリ基本クラスには、注入する構造と依存関係(global.asaxで開始された独自のISessionFactoryオブジェクト)があります。コードは次のとおりです。

public class Repository<T> : IRepository<T>
    where T : Entidade
{
    protected ISessionFactory SessionFactory { get; private set; }
    protected ISession Session
    {
        get { return SessionFactory.GetCurrentSession(); }
    }

    protected Repository(ISessionFactory sessionFactory)
    {
        SessionFactory = sessionFactory;
    }        

    public void Save(T entity)
    {
        Session.SaveOrUpdate(entity);
    }

    public void Delete(T entity)
    {
        Session.Delete(entity);
    }

    public T Get(long key)
    {
        return Session.Get<T>(key);
    }

    public IList<T> FindAll()
    {
        return Session.CreateCriteria(typeof(T)).SetCacheable(true).List<T>();
    }
}

そして、私がこのような特別なリポジトリを持った後:

public class DocumentRepository : Repository<Domain.Document>, IDocumentRepository
{
        // constructor
        public DocumentRepository (ISessionFactory sessionFactory) : base(sessionFactory) 
        { }

        public IList<Domain.Document> GetByType(int idType)
        {
            var result = Session.CreateQuery("from Document d where d.Type.Id = :IdType")
                .SetParameter("IdType", idType)
                .List<Domain.Document>();

            return result;
        }
}

このコードにはトランザクションの制御がなく、正常に機能していますが、asp.net mvcのコントローラーでこのリポジトリを制御するために、次のような単純なものを作成したいと思います。

using (var tx = /* what can I put here ? */) {
   try 
   {
     _repositoryA.Save(objA);
     _repositoryB.Save(objB);
     _repositotyC.Delete(objC);
     /* ... others tasks ... */

     tx.Commit();
   }
   catch
   {
     tx.RollBack();
   }
}

NHibernateUnitOfWorkについて聞いたことがありますが、わかりません:(、リポジトリで動作するようにNHibernateUnitOfWorkを構成するにはどうすればよいですか?単純なリポジトリを変更する必要がありますか?推測は大歓迎です!

だから、誰かがここまで読んでくれたらありがとう!私を助けることができれば、私は感謝します!

PS:私の英語でごめんなさい!

さようなら=D

4

3 に答える 3

2

セッションは NHibernate の作業単位です。しかし、いつでも独自の抽象化を作成できます。

using (var tx = Session.BeginTransaction) { ...
于 2010-05-20T19:52:06.883 に答える
1

リポジトリのセッションをパブリックプロパティにすることができます。次に、次のことを実行できます。

using(var tx = _repository.Session.BeginTransaction())

やや関連性のある注意点として、これはすべて、コントローラーではなく、サービスレイヤーの内部にある必要があります。次に、コントローラーはサービスへの参照を持つ必要があります。

于 2010-05-20T19:56:21.083 に答える
1

すぐに組み込まれた優れたUnitOfWork実装を提供するNCommonソース)と呼ばれる優れたライブラリがあります。バージョン1.1では、次のようなことができます。

public class Foo
{
    private readonly IRepository<Stuff> _repository;

    public Foo(IRepository<Stuff> repository)
    {
         _repository = repository;
    }

    public void DoSomething()
    {
        using (var scope = new UnitOfWorkScope())
        {
           _repository.Save(a);
           scope.Commit();
        }
    }
}

最新のNHibernateと統合し、NHibernate.Linqを使用していくつかの強力なクエリ機能を提供します。自分で構築するものはほとんど、またはまったくなく、箱から出してすぐに機能します。

編集:

依存性注入を使用するプロジェクトでNCommonを使用するための完全な推奨方法を示すために、例を詳しく説明しました。

于 2010-05-20T20:00:35.010 に答える