Валюта является объектом значения или нет

У меня есть агрегат Person, который является корневым агрегатом

public class Person 
{
    private int id;
    private readonly PersonID personID;

    private readonly string email;
    private readonly string firstName;
    private readonly string lastName;

    private readonly string username;
    private readonly string password;
    private readonly Address BillingAddress;
}

public class Currency : IValueObject<Currency>
{
    private string name;
    private string currencyCode;
    private decimal rate;
    private string displayLocale;
    private string customFormatting;
    private int displayOrder;
    private bool primaryExchangeRateCurrency;
    private bool primaryStoreCurrency;

    //<summary>
    //Gets or a value indicating whether the currency is primary exchange rate currency
    //</summary>

    public bool IsPrimaryExchangeRateCurrency
    {
       get
       {
           return primaryExchangeRateCurrency;
       }
    }

   /// <summary>
    /// Gets or a value indicating whether the currency is primary store currency
    /// </summary>

    public bool IsPrimaryStoreCurrency
    {
         get
         {
                return primaryStoreCurrency;
         }
    }
}

и класс Currency, на который следует ссылаться в классе Person.

Итак, теперь, если создан объект Person , нам также нужно связать его с валютой. Но среди всех созданных валют я хочу знать, какая основная валюта магазина используется по умолчанию. Я не хочу знать это через Person, потому что он содержит только одну валюту. Я хочу получить валюту PrimaryStoreCurrency из всех созданных валют людей.

Я хочу привязать валюту в раскрывающемся списке, чтобы пользователь мог выбрать свою валюту из раскрывающегося списка и зарегистрироваться в нашей системе.

Итак, я создаю валюту как отдельный агрегат?


person kamal    schedule 16.04.2011    source источник
comment
Может быть полезно: lindelauf.com/?p=17   -  person Arnis Lapsa    schedule 17.04.2011


Ответы (2)


Следующая цитата принадлежит Эрику Эвансу, где он описывает, что такое объект-значение:

Объект, представляющий описательный аспект предметной области без концептуальной идентичности, называется ОБЪЕКТОМ-ЗНАЧЕНИЕМ. ОБЪЕКТЫ-ЦЕННОСТИ создаются для представления элементов дизайна, которые нам важны только тем, что они есть, а не тем, кем они являются или чем они являются.

Другой ссылкой на это является статья MSDN о Domain Driven Design, написанная Дэйв Лариби, где он говорит:

Объекты-значения — это дескрипторы или свойства, важные в моделируемой области. В отличие от сущностей, у них нет личности; они просто описывают вещи, которые действительно имеют идентичность. Вы меняете сущность под названием «Тридцать пять долларов» или увеличиваете баланс счета?

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

И нет никакой проблемы в использовании одного и того же объекта-значения в двух разных агрегатах.

Еще один хороший пост, который может вам помочь, был написан Джимми Богард


После вашей дополнительной информации:

Я бы все же сказал, что Currency лучше всего моделировать как объект-значение — он по-прежнему кажется неизменным.

Когда вы загружаете свой агрегат Person, вам требуется, чтобы часть этого запроса загружала объект значения валюты, который является основной валютой магазина.

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

person David Hall    schedule 16.04.2011
comment
Упомянутая валюта не является неизменной. Если это объект стоимости, то вы получите разные объекты для двух человек, имеющих одинаковую валюту, что неверно. Денежные суммы являются объектами-значениями, но типы валют, подобные этому, являются сущностями. - person M.Sameer; 17.04.2011
comment
Это должно быть vo, потому что изменение валюты одного человека не должно влиять на валюту другого. - person kamal; 17.04.2011
comment
Эй, Дэвид, можешь объяснить немного больше в своей строке. Когда вы загружаете агрегат Person, вам требуется, чтобы часть этого запроса загружала объект значения валюты, который является основной валютой магазина. . Я не могу загрузить любую другую валюту лично. В платежном агрегате я хочу назначить основную валюту свойству. - person kamal; 17.04.2011
comment
@kamal - это я просто пытался интерпретировать ваши бизнес-правила. Я имел в виду, что совокупность лиц отвечает за заполнение себя правильной валютой, как и совокупность платежей. - person David Hall; 17.04.2011
comment
@kamal, если вы меняете валюту человека, вы не меняете определение валюты. Вы просто меняете ссылку на конкретную валюту. - person M.Sameer; 17.04.2011
comment
@DAVID, см. «Платежная организация», имеет ссылку на человека. Так как оплата имеет только ссылку связанного лица. Как получить валюту, которая является первичной валютой? - person kamal; 17.04.2011

Если вы подразумеваете под валютой определение валюты в приложении, например USD, EGP, EUR, .. и т. д., это должен быть многоразовый объект. Если вы имеете в виду стоимость денежных сумм, например 1000 долларов США, это объект значения, инкапсулирующий сумму и тип валюты.

person M.Sameer    schedule 16.04.2011
comment
Итак, вы имеете в виду определение валюты, о котором я говорил. Это должен быть отдельный агрегат. У меня также есть совет: вместо того, чтобы создавать логическое свойство, чтобы указать, является ли оно значением по умолчанию для магазина, а другое — для определения основной валюты обменного курса, я бы рекомендовал вам создать два статических свойства типа Currency для ссылки на две валюты по умолчанию и основную валюту. . Это облегчит их поиск вместо поиска суммы валют для тех, у которых есть истинные значения (если я правильно понял, что это будет одна основная и одна валюта по умолчанию среди всех). - person M.Sameer; 17.04.2011
comment
Как мне привязаться к раскрывающемуся списку, чтобы пользователь выбирал из раскрывающегося списка и регистрировался. - person kamal; 17.04.2011
comment
Согласен со статическими свойствами, но как мне получить основную валюту, чтобы назначить их в статических свойствах. Должен ли я запрашивать валюту всех людей и получать основную валюту, а затем назначать статические свойства. - person kamal; 17.04.2011
comment
Вам не нужно будет искать, если вы не храните его вместе с валютой. Согласно моему опыту, хорошей практикой является хранение его с системными параметрами. Это может быть файл .config или специальная таблица БД для опций. Я не понимаю, что вы имеете в виду под раскрывающимся вопросом. - person M.Sameer; 17.04.2011
comment
Я хочу предоставить пользователю раскрывающийся список, чтобы он мог выбрать свою валюту, скажем, доллар, фунт или динар из раскрывающегося списка. Создать для него отдельный xml-файл? - person kamal; 17.04.2011
comment
Если магазин полностью состоит из XML и вы не используете БД, то да, вы можете хранить все валюты в одном файле XML. Если у вас БД, то все валюты будут в одной таблице. Вам просто нужно будет запросить хранилище (XML или DB) и привязать раскрывающийся список к списку результатов объектов. Когда пользователь делает выбор, получите выбранный объект и назначьте его свойству валюты в человеке, которое должно быть сохранено как код валюты в магазине. Я правильно тебя понимаю? - person M.Sameer; 17.04.2011
comment
Предположим, моя таблица валют в первый раз пуста, как я могу привязать раскрывающийся список для валют. - person kamal; 17.04.2011
comment
Он будет пустым, а валюта человека будет нулевой. Затем пользователь должен будет сохранить человека и определить некоторую валюту, а затем вернуться, чтобы назначить ее для человека. Бизнес-логика должна предполагать, что лица с нулевой валютой имеют системную валюту по умолчанию. Системная валюта по умолчанию должна быть определена администратором или тем, у кого есть разрешение на определение валют. - person M.Sameer; 17.04.2011
comment
Если администратор определяет валюты по умолчанию, то он должен создавать людей по умолчанию слишком излишне? - person kamal; 17.04.2011
comment
Нет, нет. Люди зависят от валют, а не наоборот. - person M.Sameer; 17.04.2011