Проблема экземпляра регистра IoC с MVC3, Unity и NHibernate - (библиотека Unity.MVC3 из codeplex) - PullRequest
2 голосов
/ 14 октября 2011

Я использую Unity.MVC3.dll из codeplex и пытаюсь зарегистрировать экземпляр сеанса NHibernate ISession для каждого запроса. В соответствии с документами Unity MVC3 мне просто нужно использовать HierarchicalLifetimeManager для этого:

var container = new UnityContainer();
container.RegisterInstance<ISession>(SessionFactory.OpenSession(), new HierarchicalLifetimeManager());
container.RegisterControllers();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));

SessionFactory - это статический объект в моем Global.asax. Когда я добавляю ISession к одному из моих контроллеров, я получаю следующее сообщение об ошибке:

Текущий тип, NHibernate.ISession, является интерфейсом и не может быть построен. Вам не хватает отображения типов?

Я думал, что мне не нужно RegisterType при регистрации экземпляра?

В моем контроллере у меня есть:

[Dependency]
public ISession session { get; set; }

Я также пытался добавить ISession в качестве аргумента к одной из моих функций ActionResult

Я добавлю, что проблема не в конце NHibernate. Конфигурация прошла успешно, и я могу использовать ее для запроса информации из моей базы данных.

UPDATE

Когда я не указываю менеджер времени жизни, он работает, однако это не даст мне мой «один экземпляр на запрос», который мне нужен.

Возможно, мне придется исследовать Ninject: p

Ответы [ 2 ]

1 голос
/ 16 октября 2011

Попробуйте использовать тип регистра с фабрикой инъекций, а не регистром

Что-то вроде:

Container.RegisterType<ISession>(new InjectionFactory(c => SessionFectory.OpenSession()), new HierarcicalLifetimeManager());
1 голос
/ 15 октября 2011

Если вы используете MVC, почему бы просто не использовать Constructor Injection, чтобы оно передавалось в ваш контроллер при его создании. Это корень вашего запроса. У меня есть рабочий код для этого, если вам интересно - я приведу его сюда, если так. Также только я, но мне не очень нравятся ссылки, где вы должны поместить вашу конкретную ссылку в коде, очень похоже на то, что показано в коде bootstrapper.cs С помощью Unity ваш интерфейс-> конкретные сопоставления может быть помещен в файл конфигурации.

...