После просмотра презентации NDC12 "Создание Wicked Domain Models" от Джимми Богарда (http://ndcoslo.oktaset.com/Agenda), я размышлял, как сохранить это разновидность доменной модели.
Это пример класса из презентации:
public class Member
{
List _offers;
public Member(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
_offers = new List();
}
public string FirstName { get; set; }
public string LastName { get; set; }
public IEnumerable 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 подходит не для каждого проекта, особенно для уже существующих. Или не?
Я знаю о подобных вопросах здесь, но не смог найти конкретного примера и решения.