0

У меня расстраивать вопрос с Ninject и MVC 4.Ninject системуЗабыли Scope Потеря Binding

Вот код блока:

Kernel.Bind<IUserInfo>().To<UserInfo().InRequestScope(); 
var userInfo = Kernel.Get<IUserInfo>(); 

Большую часть времени, это хорошо, и у меня есть пользовательская информация. Иногда, однако, я получаю следующее сообщение об ошибке:

Error activating IUserInfo 
No matching bindings are available, and the Type is not self-bindable. 
Activation path: 
    1) Request for IUserInfo 
Suggestions: 
    1) Ensure that you have defined a binding for IUserInfo. 
    2) If the binding was defined in a module, ensure that the module has been loaded into the kernel. 
    3) Ensure you have not accidentally created more than one kernel.  
    4) If you are using constructor arguments, ensure that the parameter name matches the constructors parameter name.\r\n 5) If you are using automatic module loading, ensure the search path and filters are correct. 

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

Я вижу много ссылок на использование пакетов Ninject MVC Nuget, но приложение, когда я унаследовал его, не использует их, оно инициализирует Ninject с помощью ActionFilter. Является ли этот шаблон просто сломанным по своей сути и каким-то образом вмешивается в надлежащую привязку?

Помощь?

+0

Вы решаете использовать IUserInfo или UserInfo? Исключение составляет первое. Но ваш пример использует UserInfo. – treze

+0

Упс, хороший улов. Я разрешаю для IUserInfo, я отредактирую вопрос. – normanthesquid

ответ

0

Оказалось, что более новые версии Ninject нуждаются в дополнительной настройке для работы InRequestScope. Полностью удалив Ninject и прочитав ссылки на Ninject, Ninject.Web.Common и Ninject.Web.MVC, он добавил файл Ninject.Web.Common.cs, который необходим для работы InRequestScope.

Раньше это было фактически обязательным InTransientScope, что означало, что он собирал мусор, который не является детерминированным, что объясняет мои прерывистые проблемы. Хотелось бы, чтобы это исключило исключения, когда я попытался связать InRequestScope, но c'est la vie.

0

Посмотрите на BindFilter вариант https://github.com/ninject/ninject.web.mvc/wiki/Filter-configurations

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

Смежные вопросы