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

3
我正在使用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。 我已经搜索了关于仓储模式和NHibernate(以及WCF)的大量内容,到目前为止,我已经阅读了以下内容:

http://daniel.wertheim.se/2009/10/21/nhibernate-hbmnhibcontext-fluentnhibcontext/ WCF应用程序中的NHibernate会话管理 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

我认为,现在每个实体应该有一个Repository,然后在服务操作变得更加复杂时,最终可以在这些Repository之上添加某种类型的聚合根Repository。那是否有必要呢?

谢谢。

1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
1

这篇由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();
    }
}

谢谢这篇文章!我想我会尝试类似的东西。 - Jason Alati

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,