BeginTran (), Commit () и Rollback () в шаблоне репозитория - PullRequest
1 голос
/ 20 января 2010

При создании репозитория с использованием NHibetnate (или чего-либо еще) я должен сохранять явные BeginTransaction (), Commit (), Rollback (), как показано ниже?

public class NHibernateRepository<T> : IRepository<T>
{
    private NHibernate.ISession _session;

    public NHibernateRepository()
    {
        _session = NHibernateSessionManager.Instance.GetSession();
        _session.BeginTransaction();
    }

    public void Save(T obj)
    {
        _session.Save(obj);
    }

    ... ... ... ... ... ... ...

    public void Commit()
    {
        if (_session.Transaction.IsActive)
        {
            _session.Transaction.Commit();
        }
    }

    public void Rollback()
    {
        if (_session.Transaction.IsActive)
        {
            _session.Transaction.Rollback();
            _session.Clear();
        }
    }

    public void BeginTransaction()
    {
        Rollback();
        _session.BeginTransaction();
    }
}

Или я должен написать свои методы постоянства, как это?

public class Repository<T> : IRepository<T>
    {
        ISession _session;

        public Repository()
        {
            _session = SessionFactoryManager.SessionFactory.OpenSession();
        }

        private void Commit()
        {
            if (_session.Transaction.IsActive)
            {
                _session.Transaction.Commit();
            }
        }

        private void Rollback()
        {
            if (_session.Transaction.IsActive)
            {
                _session.Transaction.Rollback();
                _session.Clear();
            }
        }

        private void BeginTransaction()
        {
            _session.BeginTransaction();
        }

        void IRepository<T>.Save(T obj)
        {
            try
            {
                this.BeginTransaction();

                _session.Save(obj);                

                this.Commit();
            }
            catch (Exception ex)
            {
                this.Rollback();

                throw ex;
            }            
        }

        ... ... ... ... ... ... ...
    }
}

Есть предложения? Кто-нибудь может сравнить эти два подхода?

Ответы [ 2 ]

2 голосов
/ 20 января 2010

Создайте отдельный ITransactionManager, который будет возвращать My.ITransaction, который вы позже будете фиксировать и откатывать по мере необходимости.

В настоящее время вы просто интерфейс класса pollutin и представляете сложность и странность (например, можно ли вызвать BeginTransation в одном хранилище, а затем Commit в другом?).

1 голос
/ 20 января 2010

Мой подход состоит в том, чтобы позволить пользовательскому интерфейсу / любому другому объекту контролировать область работы (ISession) и передавать ISession в конструкторы репозитория в качестве зависимости. Таким образом, одна единица работы может привлечь столько транзакций, сколько необходимо для транзакции.

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