У меня есть корзина службы IShoppingCartService
, который определен с Ninject как InRequestScope
Инъекция Request Scope объектов в MVC ActionFilterAttribute
this.Bind<IShoppingCartService>().To<ShoppingCartService>().InRequestScope();
Он загружает корзины пользователя и кэширует его внутри. Как только запрос завершен, объект службы уходит.
Мне нужно было получить доступ к корзине покупок в пределах ActionFilter
, поэтому я использовал атрибут [Inject]
.
public class MyActionFilterAttribute : ActionFilterAttribute
{
[Inject]
public IShoppingCartService ShoppingCartService
{
get; set;
}
}
можно затем использовать его в фильтре действия как этот
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
var cart = ShoppingCartService.ShoppingCart;
...
}
Теперь для странной части. Это работает отлично в течение года или более - и вдруг (после недавнего обновления Ninject и MVC) я заметил, что корзина покупок кэшируется (то есть не InRequestScope
).
В дальнейших исследованиях я вижу, что ActionFilters являются одноточечными (я проверил это, учитывая, что конструктор только когда-либо назывался один раз). Поэтому, как только загружен экземпляр корзины покупок, он заблокирован навсегда.
Итак, мой вопрос - как это все работает? Недавно что-то изменилось в Ninject или MVC, что могло позволить это работать раньше.
Мой исправить прямо сейчас, чтобы сделать следующее:
public IShoppingCartService ShoppingCartService
{
get
{
var scs = (IShoppingCartService) DependencyResolver.Current.GetService(typeof(IShoppingCartService));
return scs;
}
}
Я действительно путают, хотя о том, как это когда-либо мог бы работать - и это определенно сделал. Что я должен был сделать вместо этого?