我需要将一些具有依赖关系注入的服务注入到操作过滤器中。我熟悉[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 loggerFactory
由dependency injection container
解决。para1
和para2
由ParameterTypeFilter
解决。// // 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"); }