Прежде всего - вам нужно понять, действительно ли вам нужна полноценная SOA.
SOA в основном означает, что каждая операция проходит через службу, которая отделяет нашу систему от других систем. В редких случаях (если приложение становится очень большим) - одна часть системы из другой.
Будет ли ваше приложение "общаться" с любым другим приложением?
Если нет, и вы просто создаете монолитный веб-сайт, освободите свой разум и избавьтесь от этого SOA-буллпрапа. В противном случае вы получите бесполезный слой абстракции.
Это единственный способ применить второй подход, потому что вы не можете полностью отделить модель предметной области, не сопоставив ее с чем-то другим.
В случае, если действительно требуется SOA - мы должны инкапсулировать, скрыть от внешнего мира нашу модель предметной области. Это значит - должно быть какое-то отображение из нашей модели в DTO.
Есть ли статья / учебное пособие, в которых объясняется, как сопоставить AccountSummary DTO с FixedAccount / SavingsAccount
Картирование само по себе не сложная идея. Вот один простой способ сопоставления объектов:
class AccountSummary{
public string InterestingThing {get; set;}
public string AnotherThing {get; set;}
}
class AccountSummaryMapper{
public static Map(BankAccount a){
return new AccountSummary{
InterestingThing=a.SomethingSomething,
AnotherThing=a.Something.Else.ToString()
};
}
}
var accountSummary=
AccountSummaryMapper.Map(myBankAccount);
Это может показаться неэффективным. Могут помочь сопоставления объект-объект, такие как Automapper . Пройдите учебник, он должен быть достаточно хорош, чтобы вы начали. Идея несложная - вы создаете Карты, сообщаете о них Mapper при запуске приложения, а затем используете Mapper для сопоставления ваших объектов с заданной конфигурацией.
Также - подумайте о направлении на карту. Хороший объектно-ориентированный код обычно означает, что вы либо задаете вопросы, либо говорите объекту делать вещи. Объекты не должны знать о внутренней работе других объектных обязанностей.
По аналогии - плохо для родителей выполнять домашнее задание для ребенка, потому что ребенок не научится ничему, и родители будут обременены ненужной работой. Вместо этого - родитель должен заставить ребенка работать самостоятельно.
Отображение AccountSummary непосредственно в BankAccount и восстановление его состояния похоже на выполнение домашней работы. Там не должно быть необходимости в таком отображении. Вместо этого - сообщите BankAccount BankAccount.DoHomework (карандаш, тетрадь, некоторые сильные слова).
развивать бизнес-домен
Вы не разрабатываете бизнес-домен. Вы разрабатываете модель предметной области, которая является просто отражением бизнес-предметной области, созданной для решения конкретных проблем.