У меня есть приложение MVC3 с простым сервисом Log.Все мои службы вызываются с помощью контейнера Microsoft Unity Dependency Injection.
Для большинства методов я игнорирую исключения;они попадают в обработчик ошибок верхнего уровня, который классифицирует их и решает, регистрировать их или нет, генерирует желаемый HTTP-ответ и вызывает метод действия на контроллере ошибок, чтобы вернуть мою страницу ошибок custiom.
Иногда я не хочу этого делать;Я хочу обработать исключение, где это происходит, например, в моем контроллере.В этом случае я хочу записать ошибку перед тем, как подставить соответствующее значение по умолчанию и продолжить с логикой контроллера.
Я сделал это в одном месте: в моем контроллере я добавил:
var logService = DependencyResolver.Current.GetService<ILogService>();
try { /* something indeterminate */ }
catch ( Exception ex ) {
logService.LogException(category, ex);
/* do something else instead */
}
Теперь я хочу сделать это второй раз в этом контроллере (как это происходит позже в том же методе).Как только я делаю это снова, я вижу, что пришло время провести рефакторинг, поскольку я повторяюсь.
Какой лучший способ сделать мой регистратор доступным для моих контроллеров?Все мои контроллеры наследуются от пользовательской ControllerBase;Моя первая мысль - добавить его в конструктор ControllerBase.НО:
- в настоящее время у меня нет конструктора в ControllerBase,
- Я немного обеспокоен тем, что ссылка на контейнер DI в контроллере нарушает изоляцию контроллера,для начала нужно отрицать значение DI и
- Я не думаю, что смогу передать регистратор конструктору ControllerBase, потому что (насколько я понимаю, поправьте меня, если я не прав), контроллеры могут толькоу них есть конструкторы без параметров, поэтому нет возможности передать им что-либо.
Где найти место, где сервис будет доступен для всех моих контроллеров?