2010-08-12 5 views
3

Я разрабатываю веб-сервис, используя NHibernate, WCF и Oracle 11g R1. Веб-сервис довольно прост: он сопоставляет DTOs с POCOs и выполняет на них различные операции CRUD на основе вызванной операции. Каждый объект имеет свой собственный набор методов CRUD - это временный, но необходимый на данный момент.NHibernate: несколько объектов, одна транзакция - несколько репозиториев?

Я ищу информацию о хорошем шаблоне репозитория, который будет поддерживать этот слой обслуживания 1: 1 CRUD и теперь не будет полностью удален, когда API должен стать более надежным. Сейчас пользователи будут обновлять объекты, используя эту услугу «по частям», но позже эти операции будут более надежными. То есть Операция службы будет работать с несколькими объектами.

Итак, в качестве примера у меня есть сущности A, B и C. Будут операции CRUD для A, B и C. В настоящее время, когда потребитель работает с 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 по запросу

Я думал, что это будет иметь смысл иметь Repository за объектом в настоящее время, а затем в конечном итоге некоторый тип совокупный корневой репозиторий может быть добавлен поверх них, когда операции обслуживания были более сложными. Это было бы необходимо?

Спасибо.

ответ

1

This Статья MSDN от K Scott Allen объединяет репозитории с шаблоном 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(); 
    } 
} 
+0

Спасибо за эту статью! Думаю, я дам что-то вроде этого. –