MVC3: правильное место, чтобы добавить зависимость от класса регистратора? - PullRequest
1 голос
/ 02 сентября 2011

У меня есть приложение 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.НО:

  1. в настоящее время у меня нет конструктора в ControllerBase,
  2. Я немного обеспокоен тем, что ссылка на контейнер DI в контроллере нарушает изоляцию контроллера,для начала нужно отрицать значение DI и
  3. Я не думаю, что смогу передать регистратор конструктору ControllerBase, потому что (насколько я понимаю, поправьте меня, если я не прав), контроллеры могут толькоу них есть конструкторы без параметров, поэтому нет возможности передать им что-либо.

Где найти место, где сервис будет доступен для всех моих контроллеров?

Ответы [ 2 ]

3 голосов
/ 02 сентября 2011

Поместите это в свой конструктор.Вы даже можете поместить его в BaseController.

. В идеале вы будете использовать Dependency Injection, чтобы он входил в ваш контроллер.Контроллеры могут иметь параметры, если ваш контейнер IoC поддерживает это.

private readonly ILogService logService;
public MyController(ILogService logService) 
{
   this.logService = logService;
}
1 голос
/ 02 сентября 2011

Я бы не стал добавлять его в базовый контроллер по той единственной причине, что он звучит так, как будто вы используете его только время от времени.Я бы добавил это, как предлагает Даниэль Уайт в конструкторе контроллера.Если он выглядит так, как будто вы используете его в большинстве контроллеров, то я бы подумал перенести его на базу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...