DDD (Domain Driven Design), как обрабатывать изменения состояния сущности и инкапсулировать бизнес-правила, требующие обработки большого количества данных

public class Person
{
    public IList<String> SpecialBirthPlaces;
    public static readonly DateTime ImportantDate;
    public String BirthPlace {get;set;}

    public DateTime BirthDate
    {
        set
        {
            if (BirthPlace!=null && 
                value < ImportantDate && 
                SpecialBirthPlaces.Contains(BirthPlace))
            {
                BirthPlace = DataBase.GetBirthPlaceFor(BirthPlace, value);
            }
        }
    }
}

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

Однако у меня есть две проблемы с реализацией этого правила:

  1. Это правило изменяет состояние доменной сущности (свойство), и мне нужно отразить это изменение в пользовательском интерфейсе. Моя доменная модель - POCO. Я мог бы поместить эту логику в ViewModel, но это неправильно, потому что это не логика пользовательского интерфейса. Это важное правило домена, которое мне нужно отразить.

  2. Мой список SpecialBirthPlaces довольно большой, и я не хочу пополнять его каждый раз, когда получаю клиента из базы данных. Кроме того, мне нужно получить замену для Birthplace, когда правило выполнено. Как я уже сказал, список особых мест рождения и замен для них очень большой и хранится в БД.

Как реализовать нужную мне логику в стиле DDD?

22
задан Cœur 8 October 2017 в 13:23
поделиться