StructureMap / NHibernate Session Per Request, включая постоянное преобразование - PullRequest
4 голосов
/ 29 ноября 2009

Я только начал использовать StructureMap в своих приложениях MVC, и все идет хорошо, за исключением обработки моего ITranscation в правильном направлении.

Я хочу создать новую ISession для каждого запроса. Вместе с этим я хочу начать транскрипцию.

В конце запроса я совершу транскрипцию.

У меня вопрос, как я могу сделать это наилучшим образом с StructureMap. Я нашел много примеров в Google, но ни один из них не запускает транскрипцию с запросом, и я действительно не хочу делать это в моих методах.

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 30 ноября 2009
1 голос
/ 30 ноября 2009

Это, наверное, не так просто, но вот мое мнение. Создайте единицу работы, которая в основном оборачивает сеанс и транзакцию, и сохраните ее для запроса и подтверждения или отката после завершения запроса.

public interface IUnitOfWork : IDisposable
{
    ISession Session { get; }
    void Commit();
    void Rollback();
}

Реализация может выглядеть следующим образом:

public class UnitOfWork : IUnitOfWork
{
    private readonly ITransaction _tx;
    public ISessionFactory SessionFactory { get; set; }

    public UnitOfWork()
    {
        SessionFactory = ObjectFactory.GetNamedInstance<ISessionFactory>(Keys.SessionFactoryName);
        Session = SessionFactory.OpenSession();
        _tx = Session.BeginTransaction();
    }

    public UnitOfWork(ISessionFactory sessionFactory)
    {
        SessionFactory = sessionFactory;
        Session = SessionFactory.OpenSession();
        _tx = Session.BeginTransaction();
    }

    public ISession Session { get; private set; }

    public void Commit()
    {
        if (_tx.IsActive)
            _tx.Commit();
    }

    public void Rollback()
    {
        _tx.Rollback();
    }
}

Просто утилизируйте единицу работы в конце запроса.

...