NHibernate + Structuremap + TransactionScope

Мне было интересно, если кто-то может предложить лучший шаблон для использования в приведенном выше сценарии, предполагая, что

A) StructureMap используется следующим образом:

            cfg.For<ISession>()
                .LifecycleIs(new TransientLifecycle())
                .Use(ctx => ctx.GetInstance<ISessionFactory>().OpenSession());

Б) Я хотел бы, чтобы все вызовы методов к различным службам / репозиториям в рамках одного действия контроллера были заключены в TransactionScope, а это означает, что если какое-либо из действий идет неправильно, то ни одно из них не должно быть зафиксировано.

Я где-то читал, что сессия должна быть построена в блоке TransactionScope, если это должно сработать, что в моем случае не так, учитывая, что сессия вводится в каждом репозитории с помощью Structuremap.

1 ответ

Если вам нужен больший контроль над областью вашей ISession, я бы вместо этого внедрил ISessionFactory в ваши контроллеры и оставил бы ISession внедряться в ваших репозиториях или внедрил фабрику / фабрики для создания ваших экземпляров репозитория. Таким образом, в каждом действии контроллера вы можете сделать что-то вроде:

using (var session = sessionFactory.OpenSession())
{
    // Do controller actions
    IMyRepository myRepository = repositoryFactory<IMyRepository>.Create(session);

    var myObject = myRepository.FindSomething();
    ...
}
Другие вопросы по тегам