StructureMap / NHibernate Session Per Request, включая постоянную трансляцию

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

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

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

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

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


person jhovgaard    schedule 29.11.2009    source источник


Ответы (2)


Эти две статьи должны помочь.

http://trason.net/journal/2009/10/7/bootstrapping-nhibernate-with-structuremap.html

http://trason.net/journal/2009/10/14/nhibernate-transactional-boundaries.html

person Kristoffer Ahl    schedule 30.11.2009
comment
Вторая ссылка выглядит очень интересно. Я вернусь к вам. Пока спасибо. - person jhovgaard; 30.11.2009
comment
trason.net/journal/2009/10/14/ был классный пост! :) - person jhovgaard; 01.12.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();
    }
}

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

person mhenrixon    schedule 29.11.2009
comment
Это именно то, что мне нужно, спасибо! Должен ли я тогда просто вызвать Commit () и удалить EndRequest в моем IHttpModule? - person jhovgaard; 30.11.2009
comment
Да, не пытайтесь удалить транзакцию после ее фиксации (она удаляется после фиксации). Просто единица работы. - person mhenrixon; 01.12.2009