c# - 使用 Autofac KeyFilterAttibute 将服务注入(inject) Action Filter

标签 c# asp.net-core autofac

我在ConfigureServices中注册了ActionFilterAttribute,但是我想通过KeyFilter属性CustomActionFilter中注入(inject)服务

public class CustomActionFilter : ActionFilterAttribute
{
    public CustomActionFilter([KeyFilter("test2")]IService service)
    {
    }
} 

过滤器注册:

public IServiceProvider ConfigureServices(IServiceCollection services)
{
    services.AddScoped<CustomActionFilter>();
}

public class Service1 : IService
{

}

public class Service2 : IService
{

}

builder.RegisterType<Service1>().Keyed<IService>("test1");
builder.RegisterType<Service2>().Keyed<IService>("test2");

有没有人有想法,我怎样才能注册过滤器以支持键过滤?

最佳答案

您需要确保 IService 和操作过滤器的任何其他依赖项也已注册。

public IServiceProvider ConfigureServices(IServiceCollection services) {
    //...

    // Autofac
    services.AddAutofac();

    var builder = new ContainerBuilder();

    //core integration
    builder.Populate(services);

    // Register the components getting filtered with keys
    builder.RegisterType<Service1>().Keyed<IService>("test1");
    builder.RegisterType<Service2>().Keyed<IService>("test2");

    // Attach the filtering behavior to the component with the constructor
    builder.RegisterType<CustomActionFilter>().WithAttributeFiltering();

    var container = builder.Build();    
    var serviceProvider = new AutofacServiceProvider(container);

    return serviceProvider;
}

使用 ServiceFilter 属性将自定义过滤器添加到 Controller 方法和 Controller 类中,如下所示:

[ServiceFilter(typeof(CustomActionFilter))]
[Route("api/custom")]
public class CustomController : Controller {
    // GET: api/issues
    [HttpGet]
    [ServiceFilter(typeof(CustomActionFilter))]
    public IActionResult Get() { 
        //...
    }
}

或者您可以在 ConfigureServices 中全局注册它

public void ConfigureServices(IServiceCollection services) {
    services.AddMvc(options => {
        options.Filters.Add(typeof(CustomActionFilter)); // by type        
    });

    //...
}

引用 Filters : Dependency injection

引用 AutoFac : KeyFilterAttribute Class

关于c# - 使用 Autofac KeyFilterAttibute 将服务注入(inject) Action Filter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48255759/

相关文章:

c# - 如何使用结构图解决子类和父类之间的相同依赖关系

python-3.x - 在docker上获取太多悬空图像-撰写

asp.net - 如何使用 ASP.NET Core 更新 mongo Db 集合中的嵌套 JSON 对象字段

c# - Autofac - 通过工厂方法解析

c# - 如何在 Repository 中注入(inject) EntityFramework Core DbContext

c# - 尽管字典被实例化,但字典属性始终为 null

c# - 百分位数算法

c# - 无法将 'Microsoft.NETCore.App (>= 2.0.0)' 解析为 '.NETCoreApp,Version=v2.0'

asp.net - Autofac - 设置依赖注入(inject)的基本说明

c# - 使用带有 XAML 绑定(bind)的 StringFormat 将文件夹注入(inject)图像路径