在Web Api ActionFilters上使用Simple Injector注入属性的问题

时间:2014-01-28 21:11:22

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

我们最近从ninject切换到Simple Injector,因为ninject非常慢。尝试在运行时注入Web Api ActionFilter属性时,我遇到了严重的问题。无论我尝试过什么,他们都没有解决。我的代码基于以下文档herehere以及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上注入属性?

1 个答案:

答案 0 :(得分:3)

我只是尝试通过使用您引用的文章中的代码构建示例Web API项目来重现您的问题,但它直接起作用。

我做的是以下内容:

  1. 在Visual Studio中创建一个空的Web API项目。
  2. here添加SimpleInjectorWebApiDependencyResolver并注册(就像您的问题一样)。
  3. 添加了来自here SimpleInjectorActionFilterProvider并注册了,如该文章中的代码段下方所示。
  4. 添加了您的InjectAttributePropertySelectionBehavior,并在您的示例中注册了它。
  5. 添加了您的InjectAttribute
  6. 添加了MyActionFilterAttribute(并覆盖OnActionExecuting方法以设置断点)。
  7. 添加了IMyRepositoryMyRepositoryImpl类。
  8. 通过其容器中的接口注册MyRepositoryImpl
  9. 我使用MyActionFilterAttribute
  10. 修饰了我的一个Action方法

    执行此操作并通过调用操作运行应用程序后,我看到在使用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));
    
相关问题