Я все еще немного новичок в использовании контейнеров IOC, и я немного борюсь. Я использую ASP.NET MVC 5.2 с Ninject.MVC3. У меня есть фильтр исключения, в основном руки прочь к службе журнала:Как сделать инъекцию зависимостей внутри ASP.NET MVC's RegisterGlobalFilters метод
public class ExceptionLoggerFilter : IExceptionFilter
{
private readonly ILogService _logService;
public ExceptionLoggerFilter(ILogService logService) {
_logService = logService;
}
public void OnException(ExceptionContext filterContext) {
_logService.LogError(filterContext.Exception);
}
}
Я хотел бы использовать инъекции зависимостей, чтобы получить экземпляр службы журнала. Тем не менее, метод RegisterGlobalFilters статична:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new ExceptionLoggerFilter(???));
}
}
Я мог бы использовать статический конструктор для FilterConfig, но это просто не чувствует себя как хорошее решение.
Я попытался с помощью инъекции свойства в классе ExceptionLoggerFilter, но это просто не работает (LogService всегда нуль):
[Inject]
public ILogService LogService { get; set; }
Я прочитал на использование шаблона Factory, но это не делает похоже, помогут здесь, так как мне все равно придется вводить класс Factory в статический конструктор класса FilterConfig. Я могу ошибаться, но это тоже не похоже на правильное решение. Метод
В настоящем время, я использую только что дать-мне-ан-примера:
var logService = (ILogService)DependencyResolver.Current.GetService(typeof(ILogService));
filters.Add(new ExceptionLoggerFilter(logService));
Это работает, но это хорошее решение? Есть ли способ лучше? Является ли мое мышление об инъекции зависимостей и контейнерах МОК испорченными?
Выполнение этого, как правило, плохая идея, если вы точно не знаете, что регистрация 'IExceptionFilter' (и всех ее зависимостей) ar e singleletons, поскольку глобальный фильтр MVC хранится глобально, что означает, что они становятся одиночными. – Steven