Я использую Castle Windsor в своем приложении, и я хотел бы использовать пример внедрения некоторых служб ILog в свой ExceptionFilterAttribute:

public class GenericExceptionFilterAttribute : ExceptionFilterAttribute
{
    private readonly ILog _logger;

    public GenericExceptionFilterAttribute()            
    {

    }

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

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

Отношении

Carlos

6
user3511244 17 Мар 2015 в 15:51
3
 – 
Steven
17 Мар 2015 в 15:54

2 ответа

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

 public override void OnException(HttpActionExecutedContext context)
                {
                    var log= (ILog)context.ActionContext.ControllerContext.Configuration.DependencyResolver.GetService(typeof(ILog));    
                }
8
user3511244 17 Мар 2015 в 16:46
Это сработало и для нашего проекта с использованием SimpleInjector, спасибо! github.com/simpleinjector/SimpleInjector
 – 
Brandon Culley
21 Июн 2018 в 18:51

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. Я также попробовал это, создав перехватчик, который обрабатывал исключения для меня, и зарегистрировал его в замке Виндзор для перехвата элементов управления/действий, которые я хотел. Если вы сделаете еще один шаг вперед, вы можете расширить перехватчик, чтобы проверить перехваченный контроллер или метод действия для пользовательского атрибута (который вы можете создать самостоятельно) и выполнять обработку исключений только в том случае, если атрибут существует. Таким образом, вы можете просто назначить перехватчик всем контроллерам и управлять обработкой исключений на отдельных контроллерах/действиях, применяя атрибут при необходимости.

0
Community 23 Май 2017 в 15:17