После просмотра презентации NDC12 "Создание злобных моделей доменов" у Джимми Богарда (http://ndcoslo.oktaset.com/Agenda) я бродил по тому, как упорствовать в таких модель домена.
Это пример класса из презентации:
public class Member
{
List<Offer> _offers;
public Member(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
_offers = new List<Offer>();
}
public string FirstName { get; set; }
public string LastName { get; set; }
public IEnumerable<Offer> AssignedOffers {
get { return _offers; }
}
public int NumberOfOffers { get; private set; }
public Offer AssignOffer(OfferType offerType, IOfferValueCalc valueCalc)
{
var value = valueCalc.CalculateValue(this, offerType);
var expiration = offerType.CalculateExpiration();
var offer = new Offer(this, offerType, expiration, value);
_offers.Add(offer);
NumberOfOffers++;
return offer;
}
}
поэтому в этой модели домена есть некоторые правила:
- Член должен иметь имя и фамилию
- Количество предложений не может быть изменено вне
- Участник отвечает за создание нового предложения, вычисляя его значение и назначение
Если при попытке сопоставить это с ORM, например с Entity Framework или NHibernate, это не сработает.
Итак, какой лучший подход для сопоставления такого типа модели с базой данных с ORM?
Например, как я могу загрузить AssignedOffers из БД, если нет сеттера?
Единственное, что имеет для меня смысл, это использование архитектуры команд/запросов: запросы всегда выполняются с результатом DTO, а не с сущностями домена, а команды выполняются на моделях домена. Кроме того, поиск событий идеально подходит для поведения в модели домена. Но такая архитектура CQS, возможно, не подходит для каждого проекта, особенно для коричневого поля. Или нет?
Я знаю подобные вопросы здесь, но не нашел конкретного примера и решения.