DDD, как обрабатывать объекты значений без репозитория

Мне нужна помощь с объектом значения. Рассмотрим следующий пример.

У меня есть карта юридического лица, в которой есть общая валюта (доллары США, евро, фунты стерлингов) и тип карты (Visa, Visa Electron, Mastercard). Я считаю, что валюты и типы карт являются объектами стоимости и хранятся в исходном коде. Согласно значению DDD у объектов нет репозиториев.

  1. Вопрос в том, как заполнить выпадающие списки валют и типов карт в интерфейсе при создании нового объекта Card.
  2. Где разместить эти классы на уровне приложения, домена или инфраструктуры и как получить из них данные.

Простой пример был бы бесценен »

ОБНОВЛЕНИЕ1

Это был мой первый подход, но ... Я использую валюты в других организациях, таких как MoneyTransfer, там я использую EUR USD GBP и еще несколько, поэтому мне нужно создать еще одно перечисление

public enum MoneyTransferCurrency{
    USD, EUR, GBP and a few other
}

Таким образом, я дублирую некоторые валюты, и если мы перестанем обрабатывать платежи в долларах США, мне придется найти все перечисления и удалить валюту долларов США.


person Stasa    schedule 03.11.2016    source источник
comment
stackoverflow.com/ вопросы / 679005 /   -  person QuietNaN    schedule 03.11.2016
comment
Что означает прекращение обработки платежей в долларах США? Это означает, что для вашего приложения доллары США больше не используются для новых транзакций или что все, что содержит доллары США, следует удалить? Что должно произойти с вашими сохраненными данными, когда вы перестанете использовать доллары? Мне это кажется скорее проблемой валидации, чем моделированием предметной области. Подумайте об этом с точки зрения вашей предметной области.   -  person rascio    schedule 03.11.2016
comment
Означает, что вы не можете заказать карту в долларах США или не можете отправить денежный перевод в долларах США. Ничего не надо удалять.   -  person Stasa    schedule 03.11.2016
comment
Таким образом, доллар США по-прежнему существует как возможное значение в вашем домене, вам не нужно удалять его из перечисления.   -  person rascio    schedule 03.11.2016
comment
Мне нужно удалить его из раскрывающихся списков пользовательского интерфейса, но я не буду удалять купленные карты или переводы в долларах США.   -  person Stasa    schedule 03.11.2016
comment
поэтому у вас может быть статическая функция, возвращающая только допустимые значения. Эта статическая функция представляет собой запрос в терминах CQRS.   -  person rascio    schedule 03.11.2016
comment
Да! Это ответ на мои проблемы. Вчера я прочитал эти два вопроса stackoverflow.com/questions/5478253/ stackoverflow.com/questions/4921899/ добавьте их в свой ответ, и я приму его. Спасибо за уделенное время.   -  person Stasa    schedule 04.11.2016
comment
Добавлены ссылки;) Добро пожаловать!   -  person rascio    schedule 04.11.2016


Ответы (3)


Не пытайтесь усложнять простые вещи.

Если вам априори известны все возможные значения этих VO, вы можете иметь их как enum.

public enum Currency{
    USD, EUR, GBP
}

А потом из кода:

Currency.values()

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

Много раз меня критиковали за это решение с аргументами типа «Мне нужно описание значения», например, в представлении с надписью «Евро», когда у вас есть значение в евро, если у вас есть таблица, у вас может быть столбец описания.
Эту проблему легко решить с помощью файла свойств, например:

labels.currency.EUR=Euro
labels.currency.USD=Dollars

Также проверьте следующее:
- Загрузка Объект значения в списке или раскрывающемся списке, DDD
- Простой сводный вопрос о корне и репозитории

person rascio    schedule 03.11.2016

Вы неправильно поняли ВО, прочитайте дополнительную информацию о них, я думаю, что простой способ понять их - это посмотреть пример Person / Addres.

Что насчет вашего случая, просто создайте 3 таблицы, не пытайтесь усложнять простые вещи:

Card (CardID, CurrencyID, CardTypeID)  
Currency (CurrencyID, CurrencyName)  
CardType (CardTypeID, CardTypeName)

Для раскрывающихся списков вы просто запрашиваете таблицы Currency и CardType. А в будущем, если вы добавите новую валюту или CardType, это будет легко сделать.

person QuietNaN    schedule 03.11.2016

Currency и CardType не обязательно являются разумными ценными объектами. Ценностные объекты моделируют концептуальное целое, содержащее связанные атрибуты. Объекты-значения можно сравнивать, сравнивая все их атрибуты.

Подумайте, например, об объекте значения MonetaryValue, который состоит из числового значения вместе с валютой:

public class MonetaryValue {

    private BigDecimal value;
    private Currency currency;

    public Amount(BigDecimal value, Currency currency) {
        // validations:
        assertNotNull(value);
        assertNotNull(currency);

        this.value = value;
        this.currency = currency;
    }
    [...]
}

Стоимость (например, 100) и валюта (например, евро) вместе описывают ценность вещи. Вещь стоит не просто «100» и не просто «евро», а «100 евро».

Также важно сравнение ценностных объектов. Когда мы говорим о денежных значениях, необходимо сравнивать оба атрибута, стоимость и валюту. Сравнение стоимости без валюты не поможет, поскольку 100 долларов - это не 100 евро. Это еще одно указание на то, что MonetaryValue может быть разумным ценным объектом.

person Markus Pscheidt    schedule 11.11.2016