![](/img/trans.png)
[英]ServiceFilter and TypeFilter - what is the difference in injection those filters?
[英]Asp.net Core dependency injection in filters without [ServiceFilter] or [TypeFilter]
我需要注入一些带有依赖注入的服务到动作过滤器。 我熟悉[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
定义accept参数。
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 ie 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"); }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.