Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有依赖项注入的IControllerModelConvention_C#_Asp.net Core_Asp.net Core Mvc - Fatal编程技术网

C# 具有依赖项注入的IControllerModelConvention

C# 具有依赖项注入的IControllerModelConvention,c#,asp.net-core,asp.net-core-mvc,C#,Asp.net Core,Asp.net Core Mvc,我正在开发一个网站使用asp.NETCore2.0MVC。 我遇到了一种情况,我希望根据一些逻辑将不同的授权过滤器应用于不同的控制器。例如,所有以前缀Identity开头的控制器将运行一个授权筛选器,而所有其他控制器将运行另一个授权筛选器 接下来,我展示了可以通过在ConfigureServices方法中启动时向services.addMvc(options)方法添加IControllerModelConvention实现来实现这一点 services.AddMvc(options =>

我正在开发一个网站使用asp.NETCore2.0MVC。 我遇到了一种情况,我希望根据一些逻辑将不同的授权过滤器应用于不同的控制器。例如,所有以前缀
Identity
开头的控制器将运行一个授权筛选器,而所有其他控制器将运行另一个授权筛选器

接下来,我展示了可以通过在
ConfigureServices
方法中启动时向
services.addMvc(options)
方法添加
IControllerModelConvention
实现来实现这一点

services.AddMvc(options =>
{
    options.Conventions.Add(new MyAuthorizeFiltersControllerConvention());
    options.Filters.Add(typeof(MyOtherFilterThatShouldBeAppliedGlobally));
}
这里是类
MyAuthorizeFiltersControllerConvention
,您可以看到我正在根据命名约定向每个控制器添加一个特定的授权筛选器

public class AddAuthorizeFiltersControllerConvention : IControllerModelConvention
{
    public void Apply(ControllerModel controller)
    {
        if (controller.ControllerName.StartsWith("Identity"))
        {
            controller.Filters.Add(new AuthorizeFilter(...));

            // This doesn't work because controller.Filters 
            // is an IList<IFilterMetadata> rather than a FilterCollection
            controller.Filters.Add(typeof(AnotherFilter)); 
        }
        else
        {
            controller.Filters.Add(new AuthorizeFilter(...));
        }
    }
}
公共类AddAuthorizeFiltersControllerConvention:IControllerModelConvention
{
公共无效应用(控制器模型控制器)
{
if(controller.ControllerName.StartsWith(“标识”))
{
controller.Filters.Add(新的过滤器(…);
//这不起作用,因为controller.Filters
//是IList而不是FilterCollection
controller.Filters.Add(typeof(AnotherFilter));
}
其他的
{
controller.Filters.Add(新的过滤器(…);
}
}
}
我遇到的问题是,我无法使用
typeof(filter)
重载以这种方式添加过滤器,就像我在
ConfigureServices
方法中启动时那样。我之所以需要它,是因为我想添加的一些过滤器需要依赖项注入来实例化它们


我的问题是我如何才能做到这一点?甚至可能吗?

这就是你可以做到的:

controller.Filters.Add(new TypeFilterAttribute(typeof(AnotherFilter)));

您是否已尝试将筛选器添加到DI容器?@Brad我已将筛选器添加到DI容器。这不是问题所在。问题在于如何将过滤器添加到控制器中。
过滤器
属性仅接受过滤器的实例,而不接受
类型