Asp.net 在没有 [服务筛选器] 或 [类型筛选器] 的筛选器中注入核心依赖项



我需要将一些具有依赖关系注入的服务注入到操作过滤器中。我熟悉[ServiceFilter][TypeFilter]的方法,但它有点丑陋,混乱和不清楚。

有没有办法以正常方式设置过滤器? 无需包装我正在使用的过滤器[ServiceFilter][TypeFilter]

例如我想要的:

[SomeFilterWithDI]
[AnotherFilterWithDI("some value")]
public IActionResult Index()
{
return View("Index");
}

而不是:

[ServiceFilter(typeof(SomeFilterWithDI))]
[TypeFilter(typeof(AnotherFilterWithDI), Arguments = new string[] { "some value" })]
public IActionResult Index()
{
return View("Index");
}

它看起来很不同,这种方法对我来说似乎不对。

对于[SomeFilterWithDI],你可以参考@Kirk larkin的评论。

对于[AnotherFilterWithDI("some value")],您可以尝试从TypeFilterAttribute传递Arguments

  • ParameterTypeFilter定义接受参数。

    public class ParameterTypeFilter: TypeFilterAttribute
    {
    public ParameterTypeFilter(string para1, string para2):base(typeof(ParameterActionFilter))
    {
    Arguments = new object[] { para1, para2 };
    }
    }
    
  • ParameterActionFilter接受传递的参数。

    public class ParameterActionFilter : IActionFilter
    {
    private readonly ILogger _logger;
    private readonly string _para1;
    private readonly string _para2;
    public ParameterActionFilter(ILoggerFactory loggerFactory, string para1, string para2)
    {
    _logger = loggerFactory.CreateLogger<ParameterTypeFilter>();
    _para1 = para1;
    _para2 = para2;
    }
    public void OnActionExecuting(ActionExecutingContext context)
    {
    _logger.LogInformation($"Parameter One is {_para1}");
    // perform some business logic work
    }
    public void OnActionExecuted(ActionExecutedContext context)
    {
    // perform some business logic work
    _logger.LogInformation($"Parameter Two is {_para2}");
    }
    }
    

    正如Arguments的描述,ILoggerFactory loggerFactorydependency injection container解决。para1para2ParameterTypeFilter解决。

    //
    // Summary:
    //     Gets or sets the non-service arguments to pass to the Microsoft.AspNetCore.Mvc.TypeFilterAttribute.ImplementationType
    //     constructor.
    //
    // Remarks:
    //     Service arguments are found in the dependency injection container i.e. this filter
    //     supports constructor injection in addition to passing the given Microsoft.AspNetCore.Mvc.TypeFilterAttribute.Arguments.
    public object[] Arguments { get; set; }
    
  • 用途

    [ParameterTypeFilter("T1","T2")]
    public ActionResult Parameter()
    {
    return Ok("Test");
    }
    

最新更新