У меня есть служба корзины покупок IShoppingCartService
, которая определяется с помощью Ninject как InRequestScope
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;
}
}
Я действительно сбит с толку тем, как это вообще могло работать - и это определенно сработало. Что я должен был сделать вместо этого?