asp.net-web-api - 在 Web Api 操作过滤器上使用简单注入(inject)器注入(inject)属性时出现问题

标签 asp.net-web-api simple-injector

我们最近从 ninject 切换到简单注入(inject)器,因为 ninject 真的很慢。当我尝试在运行时注入(inject) Web Api ActionFilter 属性时,遇到了严重的问题。无论我尝试什么,都没有解决。我的代码基于以下文档 hereherehere 。请注意,我还尝试注册我自己的 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 项目来重现您的问题,但它直接起作用了。

我所做的如下:

  1. 在 Visual Studio 中创建一个空的 Web API 项目。
  2. here 添加了 SimpleInjectorWebApiDependencyResolver并注册(就像您的问题一样)。
  3. here 添加了 SimpleInjectorActionFilterProvider 并注册它,如该文章中的代码片段下方所示。
  4. 添加了您的 InjectAttributePropertySelectionBehavior 并像示例中那样注册它。
  5. 添加了您的InjectAttribute
  6. 添加了 MyActionFilterAttribute(并覆盖 OnActionExecuting 方法以便能够设置断点)。
  7. 添加了 IMyRepositoryMyRepositoryImpl 类。
  8. 通过容器中的接口(interface)注册了 MyRepositoryImpl
  9. 我使用 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/

相关文章:

asp.net - 使用 Azure AD 进行 headless 身份验证(用户/密码组合)

asp.net-web-api - 如何从 WEB API 响应中删除命名空间

configuration - 如何将配置参数传递给 SimpleInjector 打包?

c# - 简单注入(inject)器 : Different DbContext for selected controllers

c# - 简单的注入(inject)器插件

inversion-of-control - 当两个类都注册为单例时,简单注入(inject)器会出现生活方式不匹配错误

asp.net-mvc - AutoMapper.Mapper 不包含 CreateMap 的定义

c# - 抛出 HttpResponseException 会导致未处理的异常

asp.net-web-api - 使用 Fiddler 进行包含 OData 命令的 HTTP GET 时出现问题

c# - 在简单注入(inject)器中手动注册 Web api Controller