Как обрабатывать транзакции между несколькими универсальными IRepositories - PullRequest
1 голос
/ 24 августа 2009

Какова хорошая практика работы с (nHibernate) IT-транзакциями между несколькими репозиториями?

Сначала создали BeginTransaction () на универсальном интерфейсе, но затем я подумаю, как это будет работать между репозиториями? Я имею в виду, если удалить вещи из репозитория, а затем другие вещи из другого репозитория, но хочу обернуть всю операцию в транзакции.

хотя все репозитории совместно используют одну и ту же сессию IS (обрабатывается платформой DI), поэтому, я думаю, можно получить транзакцию IT из любого из репозиториев, а затем зафиксировать ее, и она будет работать и для всех других репозиториев.

Ответы [ 2 ]

2 голосов
/ 24 августа 2009

Не делая хранилище ответственным за управление транзакциями. Не вводите ISession непосредственно в хранилище, но используйте единицу работы, которая удерживает сеанс, запускает и фиксирует транзакцию

INHibernateUnitOfWork
{
   ISession CurrentSession { get; }
   void Start(); // begins the transaction
   void Commit();
   void RollBack();
}
0 голосов
/ 25 августа 2009

Я мог бы вместо того, чтобы сделать весь класс универсальным, просто сделать каждую функцию универсальной, например так:

public interface IRepository
{
    T Get<T>(int id);
    T SingleOrDefault<T>(Func<T, bool> query);
    IQueryable<T> Where<T>(Expression<Func<T, bool>> query);
    IQueryable<T> All<T>();
    void Save<T>(T entity);
    void Delete<T>(T entity);
    ITransaction BeginTransaction();
}

но в любом случае интерфейс более или менее зависит от nHibernate, так что, возможно, стоит все-таки реализовать шаблон Unit of Work

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...