Попробуй поймать в репозитории - PullRequest
8 голосов
/ 06 апреля 2011

Ни один из примеров, которые я рассмотрел для шаблонов репозитория, не включает какой-либо вид обработки ошибок.Почему это?Например, у меня есть это:

public virtual TItem Insert<TItem>(TItem item) where TItem:class,new()
    {
        dbContext.Set<TItem>().Add(item);
        try
        {
            dbContext.SaveChanges();
        }
        catch (DbUpdateException)
        {

            return null;
        }

        return item;

    }

Экземпляр, в котором мы нарушаем ограничение.Я ловлю DbUpdateException ... Где будет жить эта обработка ошибок, если не в самом хранилище?

Ответы [ 2 ]

9 голосов
/ 06 апреля 2011

В правильно спроектированной системе ограничения никогда не должны нарушаться. Сделайте ваши сущности умнее: не используйте слепые автоматически реализуемые сеттеры, например.

Хранилище не место для проверки данных. Правильное место:

  • Если вы проверяете просто «договорные» ограничения, например, «количество должно быть неотрицательным целым числом» или «не передавайте мне нулевого клиента», поместите логику в саму сущность (либо сеттеры, либо конструктор, либо изменяющие методы, в зависимости от ситуации).
  • Если вы проверяете бизнес-логику, поместите ее в специализированные объекты (спецификации DDD, если хотите), которые абстрагируют эту логику.

Единственное время, когда должны возникать эти исключения, - это когда вы запускаете интеграционные тесты unit и получаете сбой, который показывает, что либо ограничения вашей базы данных не соответствуют вашей сущности, либо ваша сущность реализована неправильно. Так что вы определенно не должны catch их.

3 голосов
/ 06 апреля 2011

В большинстве случаев хранилищу не нужно беспокоиться об обработке исключений. Классы, которые используют репозитории, должны справиться с этим. В вашем примере, почему вы хотите вернуть null, если произошла ошибка вставки? Разве это не менее ясно, чем просто создание исключения?

Например, допустим, мы хотим вставить запись через репозиторий, а затем распечатать новый идентификатор. Предположим, что вставка не удастся по любой причине.

var myNewItem = myRepository.Insert(myItem);
Console.WriteLine("MyItem added with ID: {0}", myNewItem.ID);

Следуя схеме в вашем вопросе, вы получите исключение NullReference во второй строке, если Insert завершится неудачей. Это немного странно. Более ясно видеть DbUpdateException в первой строке. Также лучше иметь возможность рассчитывать на Insert, всегда либо возвращая действительный экземпляр, либо выбрасывая исключение.

...