我可以在启动时设置一个ASP.NET Core剃刀页面过滤器,该过滤器使用<<TType>>()
而不是new Type()
可以很好地进行依赖项注入:
services.AddMvc(options =>
{
options.Filters.Add<Filters.AdminPageFilter>();
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddHttpContextAccessor();
这可以正常工作,但是想将此应用到目录中,例如:
services.AddMvc().AddRazorPagesOptions(options =>
{
options.Conventions.AddFolderApplicationModelConvention(
"/Admin",
model => model.Filters.Add<Filters.AdminPageFilter>()
);
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
编译抱怨:
错误CS7036没有给出与“ ConfigurationExtensions.Add(IConfigurationBuilder,Action)” Startup.cs 71所需的形式参数“ configureSource”相对应的自变量
有没有办法仅通过model.Filters.Add<Filters.AdminPageFilter>()
指定类型而不通过model.Filters.Add(new Filters.AdminPageFilter())
创建新实例?
答案 0 :(得分:1)
TypeFilterAttribute可以帮助您。它作为过滤器工厂运行,可以使用依赖项注入生成过滤器。它实现了IFilterMetadata
,因此可以将其添加到model.Filters
的AdminPageFilter位置。
这是一种扩展方法,将为您提供相同的.Add<FilterType>
功能:
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
public static void Add<TFilterType>(this ICollection<IFilterMetadata> filters) where TFilterType : IFilterMetadata {
var typeFilterAttribute = new TypeFilterAttribute(typeof(TFilterType));
filters.Add(typeFilterAttribute);
}