【发布时间】:2015-11-02 23:53:49
【问题描述】:
我有一个购物车服务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)。
在进一步的研究中,我发现 ActionFilter 是单例(我验证了这一点,因为构造函数只被调用过一次)。因此,一旦加载了购物车的一个实例,它就会永远锁定。
所以我的问题是 - 这到底是怎么做到的?最近在 Ninject 或 MVC 中做了什么改变,这本来可以让它工作的。
我现在的解决方法是执行以下操作:
public IShoppingCartService ShoppingCartService
{
get
{
var scs = (IShoppingCartService) DependencyResolver.Current.GetService(typeof(IShoppingCartService));
return scs;
}
}
我真的很困惑这到底是怎么做到的——而且确实做到了。我应该怎么做?
【问题讨论】:
标签: ninject ninject.web.mvc actionfilterattribute