我们最近从 ninject 切换到简单注入(inject)器,因为 ninject 真的很慢。当我尝试在运行时注入(inject) 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();
}
}
我尝试注入(inject)的示例代码。
public class MyActionFilterAttribute : ActionFilterAttribute {
[Inject]
public IMyRepository MyRepository { get; set; }
}
还有其他人能够在 Web Api ActionFilters 上注入(inject)属性吗?
最佳答案
我只是尝试通过使用您引用的文章中的代码构建示例 Web API 项目来重现您的问题,但它直接起作用了。
我所做的如下:
- 在 Visual Studio 中创建一个空的 Web API 项目。
- 从 here 添加了
SimpleInjectorWebApiDependencyResolver
并注册(就像您的问题一样)。 - 从 here 添加了
SimpleInjectorActionFilterProvider
并注册它,如该文章中的代码片段下方所示。 - 添加了您的
InjectAttributePropertySelectionBehavior
并像示例中那样注册它。 - 添加了您的
InjectAttribute
。 - 添加了
MyActionFilterAttribute
(并覆盖OnActionExecuting
方法以便能够设置断点)。 - 添加了
IMyRepository
和MyRepositoryImpl
类。 - 通过容器中的接口(interface)注册了
MyRepositoryImpl
。 - 我使用
MyActionFilterAttribute
装饰了我的 Action 方法之一。
完成此操作并通过调用操作运行应用程序后,我看到 Visual Studio 在设置了 MyRepository
属性的情况下破坏了 OnActionExecuting 方法。
这是我的配置:
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));
关于asp.net-web-api - 在 Web Api 操作过滤器上使用简单注入(inject)器注入(inject)属性时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21416934/