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