我们最近从ninject切换到Simple Injector,因为ninject非常慢。尝试在运行时注入Web Api ActionFilter属性时,我遇到了严重的问题。无论我尝试过什么,他们都没有解决。我的代码基于以下文档here和here以及here。请注意,我也尝试过注册我自己的IFilterProvider ..
我正在创建我的容器:
var container = new Container();
container.Options.PropertySelectionBehavior = new InjectAttributePropertySelectionBehavior();
GlobalConfiguration.Configuration.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container);
我的属性
public class InjectAttribute : Attribute { }
IPropertySelectionBehavior实现
public class InjectAttributePropertySelectionBehavior : IPropertySelectionBehavior {
public bool SelectProperty(Type serviceType, PropertyInfo property) {
return property.GetCustomAttributes(typeof(InjectAttribute), true).Any();
}
}
我正在尝试注入的示例代码。
public class MyActionFilterAttribute : ActionFilterAttribute {
[Inject]
public IMyRepository MyRepository { get; set; }
}
是否有其他人能够在Web Api ActionFilters上注入属性?
答案 0 :(得分:3)
我只是尝试通过使用您引用的文章中的代码构建示例Web API项目来重现您的问题,但它直接起作用。
我做的是以下内容:
SimpleInjectorWebApiDependencyResolver
并注册(就像您的问题一样)。SimpleInjectorActionFilterProvider
并注册了,如该文章中的代码段下方所示。InjectAttributePropertySelectionBehavior
,并在您的示例中注册了它。InjectAttribute
。MyActionFilterAttribute
(并覆盖OnActionExecuting
方法以设置断点)。IMyRepository
和MyRepositoryImpl
类。MyRepositoryImpl
。MyActionFilterAttribute
。执行此操作并通过调用操作运行应用程序后,我看到在使用MyRepository
属性设置的OnActionExecuting方法中,visual studio打破了。
这是我的配置:
var container = new Container();
container.Options.PropertySelectionBehavior =
new InjectAttributePropertySelectionBehavior();
container.Register<IMyRepository, MyRepositoryImpl>();
GlobalConfiguration.Configuration.DependencyResolver =
new SimpleInjectorWebApiDependencyResolver(container);
GlobalConfiguration.Configuration.Services.Remove(typeof(IFilterProvider),
GlobalConfiguration.Configuration.Services.GetFilterProviders()
.OfType<ActionDescriptorFilterProvider>().Single());
GlobalConfiguration.Configuration.Services.Add(
typeof(IFilterProvider),
new SimpleInjectorActionFilterProvider(container));