NHibernate: несколько сущностей, одна транзакция - несколько хранилищ? - PullRequest
3 голосов
/ 13 августа 2010

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

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

Итак, в качестве примера у меня есть объекты 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 в приложении WCF 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 Ответ

1 голос
/ 13 августа 2010

Эта статья 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();
    }
}
...