先从两件事说起。
- 我正在尝试实现一个动作过滤器,该过滤器记录动作何时开始以及何时结束
- 我很清楚 Autofac 3.0 中的 .AsActionFilter() 方法但是......
这里使用的项目基于 Orchard 1.6,已知它与 autofac 2.6.xxx 兼容。我们现在不想经历一个可能很长的升级到 Autofac 3.0 的过程,所以 .AsActionFilter() 选项对我们不可用。
另一个选项是将过滤器(扩展 ActionFilterAttribute)设置为我们的基本控制器上的一个属性(所有其他控制器都从它继承)。问题是过滤器本身有两个依赖项:
- 我们自己的服务,包含有关上下文的信息
- ILoggingService 的实现
我找不到一种将这些注入到类头的实际属性中的方法。有谁知道在注册期间通过 Autofac 的某些功能的 [Attribute] 行本身来实现此目的的方法?
动作过滤器属性:
public class GRMSActionLoggingFilter : ActionFilterAttribute {
private readonly IGRMSCoreServices _grmsCoreServices;
private readonly ILoggingService _loggingService;
public GRMSActionLoggingFilter(IGRMSCoreServices grmsCoreServices, ILoggingService loggingService) {
_grmsCoreServices = grmsCoreServices;
_loggingService = loggingService;
}
public GRMSActionLoggingFilter() { }
public override void OnActionExecuting(ActionExecutingContext actionContext) {...}
public override void OnActionExecuted(ActionExecutedContext actionContext) {...}
}
将属性分配给基本控制器:
// This currently compiles but will fail during run time as the IGRMSCoreSerivces and ILoggingService will both be null. Need to property inject these services somehow.
[GRMSActionLoggingFilter]
任何人有任何想法来实现这一目标?