DDD - DomainDrivenDesign и дата разбора - PullRequest
0 голосов
/ 24 января 2020

Я хочу, чтобы при получении значения для StatusDate он автоматически анализировался и также заполнялся StatusDateFormatted

пример:

 public string StatusDate
        {
            get
            {
               return DateParser(StatusDate);
            }

        }

        public DateTime? StatusDateFormatted { get; set; }

        public string DateParser(string date)
        {
            if (!string.IsNullOrWhiteSpace(date))
            {
                DateTime parsedDate = DateTime.MinValue;
                DateTime.TryParseExact(date, "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture,
                                        System.Globalization.DateTimeStyles.None, out parsedDate);
                if (parsedDate != DateTime.MinValue)
                {
                    StatusDateFormatted = parsedDate;
                }
            }
            return date;
        }

Но если я удалю seter из StatusDate (строка) , то я не могу заполнить его на стороне службы, потому что это свойство только для чтения. Что мне здесь не хватает?

Ответы [ 2 ]

1 голос
/ 27 января 2020

Поскольку вы пометили вопрос с помощью DDD - вы, вероятно, ошиблись, если хотите следовать шаблонам тактического проектирования.

StatusDate, скорее всего, объект значения, а не сущность. Значения объектов должны быть:

  • построены атомарно
  • неизменяемые
  • равны объектам значения того же типа, если он имеет те же свойства

Поэтому, если смоделирован как объект значения, вы должны выполнить проверку на наличие разбираемой даты в конструкторе и выдать исключение или вернуть значение ошибки, если это не так. Кроме того, удалите установщик и внедрите equals / hashcode. Наконец, предложите «проанализированную» или «отформатированную» дату статуса с помощью метода объекта-значения.

Если она изменится, объект-значение в целом должен быть заменен (неизменность)

0 голосов
/ 24 января 2020

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

Примите во внимание следующее:

public DateTime? StatusDateFormatted { get; private set; }

// Backing field for your persisted property
private string statusDate;

public string StatusDate 
{
    get { return statusDate; }
    set {
        // Each time the value is set, attempt to parse it and cache the value
        DateTime parsedDate;
        bool parsed = DateTime.TryParseExact(
            date, 
            "yyyyMMdd", 
            System.Globalization.CultureInfo.InvariantCulture,
            System.Globalization.DateTimeStyles.None, 
            out parsedDate);

        // Clear the value in case the date cannot be parsed
        StatusDateFormatted = null;
        if (parsed)
        {
            // Cache the parsed value
            StatusDateFormatted = parsedDate;
        }        
    }
}
...