DDD: может ли хранилище возвращать логические значения? - PullRequest
4 голосов
/ 15 сентября 2011

Можно ли для репозитория возвращать логические значения на основе объектов, которые он (виртуально) содержит?

Например:

if (userRepository.checkCredentials(username, password))
{
    // ...

Или лучше сделать это, еслимногословный путь:

user = userRepository.findByUsername(username);
if (user != null && user.checkPassword(password)) {
{
    // ...

Ответы [ 2 ]

7 голосов
/ 15 сентября 2011

Звучит больше как спецификация, не так ли?

if (canAuthenticateSpec.isSatisfiedBy(username, password))

Раньше я делал это со спецификацией, поэтому я могу просто и ясно проверить этот код для использования.

Но недавно я сделал этос сервисом, который выполняет работу и создает результат на основе , почему они не аутентифицировались.Итак, что-то вроде этого:

AuthenticateResult result = slAuthenticator.Authenticate(username, password)
if (result.authenticated) {
    user = result.user
} else {
    String message = result.failureReason; 
4 голосов
/ 15 сентября 2011

Репозиторий - это механизм для инкапсуляции хранения, извлечения и поиска, который эмулирует коллекцию объектов .

Я думаю, что можно возвращать логическое значениеиз хранилища, но только в том случае, если метод включает все объекты в этом хранилище.Репозиторий обычно предоставляет коллекционный интерфейс.Например, users.IsEmpty() или users.IsNameUnique("jdoe") кажутся логичными, потому что им нужен доступ ко всей коллекции.

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

В качестве альтернативы у вас может быть выделенный интерфейс Authenticator в вашем домене и реализация на уровне доступа к данным (аналогично тому, как реализованы репозитории).Или Authenticator может стать доменной службой, которая использует хранилище для внутренних нужд.Аутентификатор также может определять между «пользователь не найден» или «пароль недействителен», что, вероятно, имеет другое деловое значение.

...