我有一个异步操作过滤器(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参数。
这是一种正确的做法吗?还是有更好的解决方案?
答案 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();
这可能是这里“最干净”的方法。