После просмотра презентации NDC12 «Создание злобных моделей домена» у Джимми Богарда (http://ndcoslo.oktaset.com/Agenda) я бродил, как упорствовать в такой модели домена.
Это пример класса из презентации:Богатая модель домена с поведением и ORM
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, возможно, не подходит для каждого проекта, особенно для коричневого поля. Или нет?
Я знаю подобные вопросы здесь, но не нашел конкретного примера и решения.
Я просто смотрел одно и то же видео, и мне было интересно то же самое. Что вы думаете о передаче poco в конструкторе, а также иметь свойство readonly в классе Member, чтобы вернуть клон этого poco? Таким образом, вы можете получить данные в объекте домена и из него, чтобы сохранить его или передать его. – stralsi
Что-то вроде моментального снимка объекта? Вероятно, это сработает, но также потребует некоторого взлома, чтобы заставить его работать с инструментом ORM. Я лично не вижу легкого пути, и это принесет много абстракций и обобщений, которые вам придется сражаться повсюду в приложении. Событие sourcing - единственный способ пойти IMO –
Я на самом деле просто смотрел это видео и думал о том же; означает ли это, что вам нужен набор объектов DTO/POCO для уровня данных/персистентности, который ваш ORM увлажняет, а затем использовать сопоставление, например AutoMapper, для отображения объекта домена? Что-то подобное происходит в репозитории? Кажется, что ORM, как EF Code First, ожидает POCO с геттерами и сеттерами. – Abe