全局过滤正确的注册方式

时间:2017-10-26 13:31:46

标签: c# asp.net asp.net-core

我有一个异步操作过滤器(IAsyncActionFilter)。我希望它能在所有方法中全局工作。我可以用

注册
services.AddMvc(options =>
{
     options.Filters.Add(typeof(RequestFilter));
});

在启动课程中

我想将其注册为

services.RegisterRequestFilter(); 

我可以使用像

这样的扩展方法来做到这一点
    public static void RegisterRequestFilter(this IServiceCollection services)
    {
        services.AddMvc(options =>
        {
            options.Filters.Add(typeof(RequestFilter));
        });
    }

然后在启动时使用它,但我不知道它是否正确,因为会有2次出现services.AddMvc:一个没有任何参数,第二个带有options参数。

这是一种正确的做法吗?还是有更好的解决方案?

1 个答案:

答案 0 :(得分:1)

多次AddMvc()次呼叫不会有问题。服务,AddMvc注册,注册时不会多次注册,即使是这种情况,通常也不是问题。

您当然可以简单地为您的扩展程序AddMvcWithRequestFilter命名,只需拨打该方法,而不是分别调用AddMvc()。这样,你只会调用一次。但同样,这不会产生太大的影响。

如果你真的想避免在你的扩展方法中调用AddMvc(),你也可以直接配置MvcOptions,如下所示:

public static void RegisterRequestFilter(this IServiceCollection services)
{
    services.Configure<MvcOptions>(options =>
    {
        options.Filters.Add(typeof(RequestFilter));
    });
}

此时,您还可以考虑在IMvcBuilder上使用此扩展方法:

public static IMvcBuilder AddRequestFilter(this IMvcBuilder builder)
{
    builder.Services.Configure<MvcOptions>(options =>
    {
        options.Filters.Add(typeof(RequestFilter));
    });
    return builder;
}

然后,你可以在Startup

中这样称呼它
services.AddMvc()
    .AddRequestFilter();

这可能是这里“最干净”的方法。