6

У меня есть вопрос относительно проверки уникальности в DDD. У меня уже есть некоторые вопросы об этом в stackoverflow, но они на самом деле не отвечают на мои сомнения.уникальная проверка в DDD

Возможно ли, чтобы агрегированный корень сохранял ссылку на репозиторий для проверки уникальности при обновлении/вставке в базу данных? Или это задача, выполняемая службой приложений вместо модели домена?

Скажем, я хочу, чтобы проверить, является ли имя пользователя модели пользователя является уникальным, когда пользователь Есть несколько подходов, которые я могу думать:

  • пользователя модель эталонного UserRepository, сделать проверки уникальности в Validate()
  • Создайте службу домена, чтобы выполнить проверку уникальности, используя UserRepository (это кажется немного странным для меня, потому что я думаю, что обычно служба домена используется только в случае, если логический диапазон более чем для нескольких моделей домена)
  • Создать объект спецификации в доменном слое, применительно к использованию rRepository инкапсулировать уникальные правила проверки, и использование услуг прикладного уровня, чтобы это сделать проверку перед обновлением/вставить

И если я использую инъекции зависимостей, я все еще задаюсь вопрос о том, как внедрить UserRepository в пользователь в подходе 1, или службу домена в подходе 2 или службу приложения в подходе 3, потому что в любом случае для объекта/объекта службы/спецификации пользователя/домена мне нужно создать экземпляр объекта вручную, поэтому единственная опция, с которой я, похоже, использую локатор службы в IoC для получения экземпляра. Но служба поиска является анти-модель, поэтому я хочу, чтобы избежать его

Любой образец кода будет оценено

+2

Я бы сказал, что вы должны реализовать это на сервисном уровне. Чтобы быть более конкретным, определите класс валидатора для определенного типа бизнес-логики (ваша команда) и обработайте проверку в декораторе, который вы обернете вокруг класса обслуживания. – Steven

+0

Было бы полезно? http://stackoverflow.com/a/11958251/625332 – Dmitry

+0

@Steven, поэтому я должен создать UserValidator для реализации проверки для пользователя на уровне сервиса? Рассматривается ли утечка бизнес-правила (уникальность имени пользователя) вне уровня домена? –

ответ

4

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

// repository 
interface Users { 
    // implementation executes SQL COUNT in case of relation DB 
    bool IsNameUnique(String name); 

    // implementation will call IsNameUnique and throw if it fails 
    void Add(User user); 
} 

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

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

См. Uniqueness validation in CQRS Architecture для альтернативного подхода.

+0

, поэтому вы предлагаете следовать подходу 2 выше, чтобы создать службу домена для вызова репозитория для проверки уникальности? Является ли распространенным способом в DDD создавать службу валидации в этом доменном слое? Я новичок в DDD, поэтому не очень уверен –

+0

Использовать ли этот репозиторий из домена или из службы приложений зависит от ваших вариантов использования, один из них подходит, если вы не используете этот метод из совокупности. – Dmitry

+0

спасибо, наконец, я решил пойти на этот подход: http: // lostechies.com/jimmybogard/2007/10/24/entity-validation-with-visitors-and-extension-methods/ –

Смежные вопросы