【问题标题】:NHibernate: Multiple Entities, One Transaction - Multiple Repositories?NHibernate:多个实体,一个事务 - 多个存储库?
【发布时间】:2011-03-29 03:50:34
【问题描述】:

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

我正在寻找一个良好的存储库模式的输入,该模式现在将支持这个 1:1 CRUD 服务层,并且在 API 需要变得更健壮时不会被完全丢弃。目前,消费者将使用此服务“逐个”更新实体,但稍后,这些操作将更加健壮。 IE。一项服务操作将与多个实体合作。

因此,作为一个示例,我有实体 A、B 和 C。将有针对 A、B 和 C 的 CRUD 服务操作。目前,当消费者在本地与 A 一起工作时,它通常也与 B 和 C 一起工作. 当它使用服务来交互A、B和C时,需要进行三个独立的服务调用。目前大部分业务逻辑都驻留在消费者身上,但是当它进入服务层时,将创建一个服务操作,以便它可以在一次调用中与 A、B 和 C 一起工作。

我已经在 Repository 模式和 NHibernate(和 WCF)上进行了大量的谷歌搜索,到目前为止我已经阅读:

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

我认为现在每个实体都有一个存储库是有意义的,然后当服务操作变得更加复杂时,最终可以在这些存储库之上添加某种类型的聚合根存储库。那还有必要吗?

谢谢。

【问题讨论】:

    标签: .net nhibernate design-patterns transactions


    【解决方案1】:

    K Scott Allen 的This 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();
        }
    }
    

    【讨论】:

    • 感谢那篇文章!我想我会试试这样的。
    猜你喜欢
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 2011-09-03
    相关资源
    最近更新 更多