Лучший способ, чтобы Служба сообщала об ошибках контроллеру - PullRequest
2 голосов
/ 22 февраля 2010

Когда сервисный уровень выполняет только задачу (проверяет, существует ли Id, отправляет электронное письмо и т. Д.), Каков наилучший способ сообщить контроллеру о наличии ошибок?

Два решения, которые я могу придумать:

  1. Всегда передавая дополнительный параметр "нарушенные правила", ссылаясь на методы на уровне Сервиса, которые он будет обновлять при возникновении ошибки.

  2. Сделайте, чтобы Служба вызвала исключение, и чтобы контроллер сделал попытку / перехват.

Рекомендуется ли один из этих двух подходов? Если нет, то какой подход я мог бы использовать, чтобы уровень обслуживания сообщал контроллеру, что что-то пошло не так (например, неверный параметр)?

Ответы [ 3 ]

2 голосов
/ 22 февраля 2010

Ваш сервис должен собрать все нарушенные правила и после этого выдать исключение BrokenRuleException. Ваш контроллер перехватит «BrokenRuleException» и затем использует сломанные правила для обновления пользовательского интерфейса.

2 голосов
/ 22 февраля 2010

Я создал интерфейс:

public interface IModelStateWrapper
{
    void AddModelError(string name, string error);
}

Затем я создал реализацию для каждого контроллера:

public class ControllerModelStateWrapper : IModelStateWrapper
{
    private ModelStateDictionary _dictionary;

    public ControllerModelStateWrapper(ModelStateDictionary dictionary)
    {
        _dictionary = dictionary;
    }

    public void AddModelError(string name, string error)
    {
        if (_dictionary[name] == null)
            _dictionary.Add(name, new ModelState());
        _dictionary[name].Errors.Add(error);
    }
}

Каждый сервис реализует:

public interface IModelWrapperService
{
    IModelStateWrapper ModelWrapper {get;set;}
}

А потом я установил его в контроллере:

public UserController(IUserService service)
{
    _service.ModelWrapper = new ControllerModelStateWrapper(ModelState);
}

IModelStateWrapper - не лучшее имя, поскольку этот интерфейс может работать не только с Controller.ModelState. Работает довольно хорошо. Вы можете легко заменить IModelStateWrapper на макет или другую реализацию в своих сервисных тестах. Это решение также автоматически устанавливает ModelState как недействительный.

0 голосов
/ 21 марта 2010

Я думаю, что выбрасывание BrokenRuleException - хороший выбор.

Лично я не люблю помещать состояние в службу, это часто одноэлементное (выполняется контейнером DI) и имеет только других коллабораторов (в моем случае, доменные объекты).

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