Больше запутано, чем когда-либо, с единицами работы против ни одной и уклонением от микро-управления транзакциями в репозитории! - PullRequest
1 голос
/ 03 мая 2011

Я пришел к выводу, что не было никакой причины использовать UnitOfWork поверх сеанса NHibernate, и в этот вопрос задавал лучший способ не создавать явную транзакцию для каждогодействие по сохранению базы данных.

Только для перенаправления назад к идее единицы работы.Что ж, дальнейшие исследования привели меня обратно туда, где я изначально не должен был реализовывать отдельный шаблон единиц работы поверх NHibernate (один пример , среди прочих).

Моя проблема в том, как не использовать единицу работы, а не управлять микро-транзакциями в репозитории и хранить их отдельно?

1 Ответ

1 голос
/ 03 мая 2011

Вы все еще можете отделить хранилище от транзакции.Главное, чем вы должны управлять, это жизненный цикл вашего сеанса.

В вашем менеджере транзакций вы можете написать что-то вроде

public class TransactionManager
{
    private ISession session;

    public TransactionManager(ISession session)
    {
        this.session = session;
    }

    public void BeginTransaction()
    {
         session.BeginTransaction();
    }

    public void CommitTransaction()
    {
        session.Transaction.Commit();
    }
}

Тогда в вашем хранилище вы просто добавите сеанс

public class Repository
{
    private ISession session;

    public Repository(ISession session)
    {
        this.session = session;
    }

    public T Get<T>(int id)
    {
        return session.Get<T>(id);
    }
}

Если вы используете тот же сеанс в диспетчере транзакций, что и хранилище.Ваш репозиторий будет работать с явной транзакцией.

...