我正在尝试将UOW容器注入WebApi 2 actionfilter属性
public class VerifyApiToken : ActionFilterAttribute
{
[Inject]
public IUOW Uow { get; set; }
public override void OnActionExecuting(HttpActionContext actionContext)
{
//get and save data to any repository in the uow container
base.OnActionExecuting(actionContext);
}
UOW容器被注入就像它应该的那样,并且在第一个请求时一切正常。在后续请求中,EF抛出一个异常,说明已经处理了DbContext。
所有依赖项都绑定在请求范围内,因此基础dbcontext的处理是正常的。在WebApi控制器中使用构造函数注入时,一切正常,在每个请求上重新创建资源,为什么在尝试在ActionFilterAttributes中使用Property注入时不会重新创建它们,以及如何解决这个问题?
我正在使用的IFilterProvider:
public IEnumerable<FilterInfo> GetFilters(HttpConfiguration configuration, HttpActionDescriptor actionDescriptor)
{
IEnumerable<FilterInfo> controllerFilters = actionDescriptor.ControllerDescriptor.GetFilters().Select(instance => new FilterInfo(instance, FilterScope.Controller));
IEnumerable<FilterInfo> actionFilters = actionDescriptor.GetFilters().Select(instance => new FilterInfo(instance, FilterScope.Action));
IEnumerable<FilterInfo> filters = controllerFilters.Concat(actionFilters);
foreach (FilterInfo filter in filters)
{
_kernel.Inject(filter.Instance);
}
return filters;
}
“Inject”方法描述说“注入指定的实例,而不管理其生命周期”。所以我认为我的VerifyApiToken属性在每个App生命周期(基本上是Application_Start)注入一次,因此在以下请求中使用相同的实例(当然使用处理的DbContext)。 是否可以将Ninject配置为在ActionFilterAttributes中为每个请求使用新的IUOW容器?
答案 0 :(得分:4)
过滤器是Web Api Framework的缓存和重用。因此,您不应在请求范围中注入任何依赖;改为使用工厂。
有关详细信息,请参阅documentation
答案 1 :(得分:1)
我能够关注qujck的提示,而是将一个Func注入actionfilter。
需要以下绑定:
kernel.Bind<Func<IUOW>>().ToMethod(m => () => m.Kernel.Get<IUOW>());