没有 [ServiceFilter] 或 [TypeFilter] 的过滤器中的 Asp.net Core 依赖注入
Posted
技术标签:
【中文标题】没有 [ServiceFilter] 或 [TypeFilter] 的过滤器中的 Asp.net Core 依赖注入【英文标题】:Asp.net Core dependency injection in filters without [ServiceFilter] or [TypeFilter] 【发布时间】:2018-11-27 23:28:51 【问题描述】:我需要通过依赖注入向操作过滤器注入一些服务。我熟悉 [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");
看起来很不一样,这种方法对我来说似乎不合适。
【问题讨论】:
您的过滤器使用 DI 吗?还有你所说的“正常方式”是什么意思? @Shyju 是的,它确实使用 DI。 “正常方式” - 我的意思是没有 [ServiceFilter] 和 [TypeFilter] 包装我正在使用的过滤器。 如果您的文件管理器中有 DI,这就是使用它的方法。我认为这是“正常方式” 没有其他办法了。 DI/IoC 容器不是黑魔法。就其本质而言,必须使用已知参数来实例化属性(必须在编译时知道参数 - 这是 CIL/语言限制),这意味着只有常量。当然,您可以在 OnActionXxx 方法中访问context.HttpContext.RequestServices.GetRequiredService<IMyService>();
,但这也不是很干净,当然,它不再称为依赖注入
您可以为您的 first 示例实现IFilterFactory
(不带参数)。
【参考方案1】:
对于[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");
【讨论】:
以上是关于没有 [ServiceFilter] 或 [TypeFilter] 的过滤器中的 Asp.net Core 依赖注入的主要内容,如果未能解决你的问题,请参考以下文章
如何解决xp系统 ‘未安装ADO’‘ 请安装MDAC_typ。exe安装这个如何解决 不要说安装纯洁系统啥的。
pom文件出现Element 'xxxxxxx' cannot have character [children],because the type's content typ
OnActionExecuting ValidationAttribute
使用 Yocto Poky 为 Raspberry Pi2 构建 QtWebEngine - vcos_platform_types.h:没有这样的文件或目录