ExceptionFilterAttribute中的依赖注入C#

时间:2015-03-17 12:51:34

标签: c# asp.net-web-api dependency-injection inversion-of-control castle-windsor

我在我的应用程序中使用Castle Windsor,我想在我的ExceptionFilterAttribute中使用注入一些服务示例ILog:

public class GenericExceptionFilterAttribute : ExceptionFilterAttribute
{
    private readonly ILog _logger;

    public GenericExceptionFilterAttribute()            
    {

    }

    public GenericExceptionFilterAttribute(ILogManager logManager)
    {
        _logger = logManager.GetLogger(typeof(GenericExceptionFilterAttribute));
    }
}

如何在此课程中注入服务?

此致

卡洛斯

2 个答案:

答案 0 :(得分:3)

您好了dependencyResolver来解决这个问题:

 public override void OnException(HttpActionExecutedContext context)
                {
                    var log= (ILog)context.ActionContext.ControllerContext.Configuration.DependencyResolver.GetService(typeof(ILog));    
                }

答案 1 :(得分:0)

Webapi有一个名为IFilterProvider的接口,可能支持您正在寻找的行为。请查看https://stackoverflow.com/a/18325433/4711454http://michael-mckenna.com/blog/dependency-injection-for-asp-net-web-api-action-filters-in-3-easy-steps,了解有关如何实施此功能的示例。第二个示例基于Unity,但您可以轻松地将其修改为Castle Windsor实现。我曾经尝试过这个解决方案,它确实提供了一种在动作过滤器上进行适当的构造函数注入的方法。作为替代方案,您可以切换到Castle Windsor Interceptors。我也通过创建一个拦截器来尝试这个,该拦截器为我做了异常处理并将其注册到Castle Windsor以拦截我想要的控件/动作。如果更进一步,可以扩展拦截器以检查截取的控制器或操作方法以获取自定义属性(您可以自己创建),并且只有属性存在时才进行异常处理。这样,您可以简单地将拦截器分配给所有控制器,并通过在需要时应用属性来管理各个控制器/操作上的异常处理。