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();
...
}