2

Я использую замок Виндзор в моем приложении, и я хотел бы использовать инъекционные некоторые услуги пример Илог в моем ExceptionFilterAttribute:Dependency Injection в ExceptionFilterAttribute C#

public class GenericExceptionFilterAttribute : ExceptionFilterAttribute 
{ 
    private readonly ILog _logger; 

    public GenericExceptionFilterAttribute()    
    { 

    } 

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

Как внедрить услуги в этом классе?

С уважением

Carlos

+3

Предложите [не вставлять зависимости в атрибуты] (https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=98). Держите их [пассивными] (http://blog.ploeh.dk/2014/06/13/passive-attributes/). – Steven

ответ

1

Привет dependencyResolver, чтобы решить эту проблему:

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

WebAPI имеет интерфейс под названием IFilterProvider, которые могли бы поддержать такое поведение вы ищете. Проверьте https://stackoverflow.com/a/18325433/4711454 или http://michael-mckenna.com/blog/dependency-injection-for-asp-net-web-api-action-filters-in-3-easy-steps на примеры того, как это реализовать. Второй пример основан на Unity, но вы можете легко изменить его на реализацию Castle Windsor. Я пробовал это решение некоторое время назад, и это дает возможность делать правильную инъекцию конструктора в фильтрах действий. В качестве альтернативы вы можете переключиться на перехватчики Castle Windsor. Я попробовал это, создав перехватчик, который сделал для меня обработку исключений, и зарегистрировал его с помощью Castle Windsor, чтобы перехватить контролируемые мной действия/действия. Если вы сделаете еще один шаг, вы можете расширить перехватчик, чтобы проверить перехваченный контроллер или метод действия для настраиваемого атрибута (который вы можете создать самостоятельно), и только обработчик исключений, если атрибут есть. Таким образом, вы можете просто назначить перехватчик всем контроллерам и управлять обработкой исключений на отдельных контроллерах/действиях, применяя атрибут, если это необходимо.