Глядя на эту регистрацию, я ожидаю, что контейнер создаст для обеих регистраций один NHibernateUnitOfWork
в одном HTTP-контексте. Другими словами, я ожидаю, что следующий тест не пройдёт:
var uow1 = container.GetInstance<IUnitOfWork>();
var uow2 = container.GetInstance<IUnitOfWork<ISession>>();
Assert.IsTrue(object.ReferenceEquals(uow1, uow2));
То, что вы, вероятно, ищете, - это контейнер, возвращающий один и тот же экземпляр при разрешении как IUnitOfWork
, так и IUnitOfWork<ISession>
, что сделало бы предыдущий тест пройденным.
Вы можете изменить свою регистрацию на следующее:
For<NHibernateUnitOfWork>().HybridHttpOrThreadLocalScoped();
For<IUnitOfWork>().LifecycleIs(new UniquePerRequestLifeStyle())
.Use(() => container.GetInstance<NHibernateUnitOfWork>());
For<IUnitOfWork<ISession>>().LifecycleIs(new UniquePerRequestLifeStyle())
.Use(() => container.GetInstance<NHibernateUnitOfWork>());
В этом случае каждый раз, когда вы запрашиваете IUnitOfWork
, вы будете перезванивать в контейнер и запрашивать NHibernateUnitOfWork
, который настроен как HybridHttpOrThreadLocalScoped
.