Проверка в многоуровневом приложении

Мне интересно, как лучше всего выполнить проверку ограничений базы данных (например УНИКАЛЬНО )в приложении ASP.NET MVC, построенном с учетом DDD, где базовыми уровнями являются прикладной уровень (, службы приложений ), уровень домена (, модель домена )и уровень инфраструктуры (. логика постоянства, ведение журнала и т. д. ).

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

Точнее, у меня два вопроса. Как бы вы выполнили фактическую проверку? Будете ли вы явно проверять, существует ли имя клиента, запрашивая базу данных, или вы попытаетесь вставить его непосредственно в базу данных и перехватить ошибку, если какое-либо (покажется беспорядочным )? Я предпочитаю первый вариант, и если выбрать его, следует ли это делать в репозитории или это должна быть работа службы приложений?

Когда ошибка обнаружена, как бы вы передали ее в ASP.NET MVC, чтобы пользователь мог быть хорошо проинформирован об ошибке? Предпочтительно использовать ModelStateDictionary, чтобы ошибка была легко выделена в форме.

В приложении N -Lyered от Microsoft Spain используется интерфейс IValidatableObject, а самая простая проверка свойства выполняется на самом объекте, например:

public IEnumerable Validate(ValidationContext validationContext)
{
    var validationResults = new List();

    if (String.IsNullOrWhiteSpace(this.FirstName))
        validationResults.Add(new ValidationResult(Messages.validation_CustomerFirstNameCannotBeNull, new string[] { "FirstName" }));

    return validationResults;
}

Перед сохранением объекта,Сообщение Validate вызывается, чтобы убедиться, что свойства действительны.:

void SaveCustomer(Customer customer)
{
    var validator = EntityValidatorFactory.CreateValidator();

    if (validator.IsValid(customer)) //if customer is valid
    {
        _customerRepository.Add(customer);
        _customerRepository.UnitOfWork.Commit();
    }
    else
        throw new ApplicationValidationErrorsException(validator.GetInvalidMessages(customer));
}

Исключение ApplicationValidationErrorsException может быть перехвачено в приложении MVC, а сообщения об ошибках проверки могут быть проанализированы и вставлены в ModelStateDictionary.

Я мог бы добавить всю логику проверки в метод SaveCustomer, например. запрос к базе данных, проверяющий, существует ли клиент, используя данный столбец (УНИКАЛЬНЫЙ ). Может быть, это нормально, но я бы предпочел, чтобыvalidator.IsValid(или что-то подобное )сделало бы это за меня, или чтобы проверка выполнялась еще раз на уровне инфраструктуры (, если она относится сюда, я не уверен ). ].

Что вы думаете? Как ты это делаешь? Мне очень интересно получить больше информации о различных методах проверки в многоуровневых приложениях.


Возможное решение #1

В случае, когда логика проверки не может быть выполнена на уровне представления (, как предлагает Юлиан Маргаринтеску )и должна выполняться на уровне службы, как вы передаете ошибки проверки до уровня представления?

У Microsoft есть предложение здесь(см. листинг 5 ). Что вы думаете о таком подходе?

7
задан Tommy Jakobsen 2 May 2012 в 15:52
поделиться