NHibernate:多个实体,一个事务 - 多个存储库?

时间:2010-08-12 20:35:33

标签: .net nhibernate design-patterns transactions

我正在使用NHibernate,WCF和Oracle 11g R1开发Web服务。 Web服务非常简单:它将DTO映射到POCO,并根据调用的操作对它们执行各种CRUD操作。每个实体都有自己的一套CRUD方法 - 这是暂时的,但暂时是必要的。

我正在寻找一个良好的Repository模式的输入,该模式现在将支持这个1:1的CRUD服务层,并且当API需要变得更强大时不会被完全抛弃。现在,消费者将“逐件”使用此服务更新实体,但稍后,这些操作将更加强大。即服务操作可以与多个实体一起使用。

因此,作为一个例子,我有实体A,B和C.将有A,B和C的CRUD服务操作。目前,当消费者在本地使用A时,它最常使用B和C当它使用服务交互A,B和C时,它需要进行三次单独的服务调用。目前大多数业务逻辑都驻留在消费者身上,但当它进入服务层时,将创建一个服务操作,以便它可以在一次调用中使用A,B和C.

我已经在Repository模式和NHibernate(以及WCF)上做了相当多的Google搜索,到目前为止我读过:

http://daniel.wertheim.se/2009/10/21/nhibernate-hbmnhibcontext-fluentnhibcontext/ NHibernate session management in WCF application http://davybrion.com/blog/2008/06/managing-your-nhibernate-sessions/ http://davybrion.com/blog/2009/12/using-nhibernate-in-your-service-layer/ http://jeffreypalermo.com/blog/use-this-nhibernate-wrapper-to-keep-your-repository-classes-simple/

还有一堆其他人。我想要实现的两件基本事情:

  • 每个请求一个ISession
  • 每个请求一次ITransaction

我认为现在拥有每个实体的存储库是有意义的,然后最终可以在服务操作变得更复杂的情况下添加某些类型的聚合根存储库。这甚至是必要的吗?

感谢。

1 个答案:

答案 0 :(得分:1)

This K Scott Allen撰写的MSDN文章将存储库与UnitOfWork模式相结合。

对于NHibernate,您的UnitOfWork将使用NHibernate ISession创建,如果需要,您可以使每个UoW进行交易。显然,UoW将负责从ISession创建各种存储库...

public class NHibernateUnitOfWork : IUnitOfWork

    public NHibernateUnitOfWork(ISession session)
    {
        // if transacted you would begin the transaction here also
        _session = session;
    }

    private ISession _session;

    private IRepository<A> _aRepository   
    public IRepository<A> ARepository
    {
        get
        {
            if(_aRepository == null)
                _aRepository = new NHibernateRepository<A>(_session);

            return _aRepository;    
        }
    }

    private IRepository<B> _bRepository   
    public IRepository<B> BRepository
    {
        get
        {
            if(_bRepository == null)
                _bRepository = new NHibernateRepository<B>(_session);

            return _bRepository;    
        }
    }

    private IRepository<C> _cRepository   
    public IRepository<C> CRepository
    {
        get
        {
            if(_cRepository == null)
                _cRepository = new NHibernateRepository<C>(_session);

            return _cRepository;    
        }
    }

    public void Commit()
    {
        // if transacted you would commit the transaction here
        _session.Flush();
    }

    public void Dispose()
    {
        _session.Dispose();
    }
}