使用model.Filters.Add <tfiltertype>()配置ASP.NET Core剃须刀页面过滤器

时间:2018-12-04 07:34:19

标签: c# asp.net-core dependency-injection razor-pages

我可以在启动时设置一个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())创建新实例?

1 个答案:

答案 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);
}