Транзакции Nhibernate: предотвращение зависимости Nhibernate на уровне сервиса - PullRequest

Ответы [ 3 ]

5 голосов
/ 30 марта 2010

Одним из способов решения этой проблемы является обертка семантики сеанса и транзакции NHibernate в вашем собственном абстрактном классе интерфейса / реализации. Таким образом, если вы когда-нибудь захотите сказать, переключитесь на Linq2Sql, вы можете создать реализацию L2S. Однако это по-прежнему означает, что семантика транзакции все еще будет на уровне службы, но не вызовы, специфичные для NHibernate. Google IRepository<T> для многих примеров, как это сделать.

Однако, если вы не планируете отключать ORM в будущем, можно утверждать, что наличие NHibernate на уровне обслуживания не обязательно является плохой вещью, поскольку NHibernate сам по себе является абстракцией уровня данных. 1004 *

4 голосов
/ 31 марта 2010

Я тоже хочу это сделать, но пока не остановился на подходе из-за нехватки времени и некоторого ЯГНИ.

Вот код, который я еще не тестировал, но адаптировал из проекта SharpArch с открытым исходным кодом.Мне очень нравится интерфейс, но я, возможно, немного изменил реализацию NHib, поскольку есть некоторые вещи, которые мне не нравятся в реализации репозитория SharpArch, но вы можете судить сами.

Конечно, используя NHib session.BeginTransaction () вводит зависимости NHib, и отсутствие абстрагирования кажется противоречащим абстрагированию IRepository и всего остального.Я, например, был бы очень заинтересован в том, что вы заключаете в качестве полезной абстракции транзакций.

HTH,
Berryl

public interface IDbContext {
    void CommitChanges();
    IDisposable BeginTransaction();
    void CommitTransaction();
    void RollbackTransaction();
}

public class DbContext : IDbContext {
    private readonly ISession _session;

    public DbContext(ISession session)
    {
        Check.RequireNotNull<ISession>(session);
        _session = session;
    }

    public void CommitChanges() { _session.Flush(); }

    public IDisposable BeginTransaction() { return _session.BeginTransaction(); }

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

    public void RollbackTransaction() { _session.Transaction.Rollback(); }

}
1 голос
/ 31 марта 2010

Звонки на какой-то статичный синглтон, о котором так говорят, не кажутся мне хорошей идеей. Возможно, было бы лучше добавить зависимость от вашего собственного "ITransactionFactory" и оставить специфичный для NHibernate код внутри реализации TransactionFactory.

В частности, для SharpArchitecture существует фильтр действий TransactionAttribute, предназначенный для включения ваших методов действий в транзакции.

Что касается ссылок на сборку в NHibernate, я бы не беспокоился об этом лично.

...