Это известная проблема с DTO. Это описано в этом посредственном статье на MSDN . Перефразируя: DTO - это самый универсальный n-уровневый шаблон доступа к данным, но он также требует большей работы.
Вы можете решить некоторые проблемы с помощью сопоставления, используя сопоставление на основе соглашений, например AutoMapper .
Когда дело доходит до взрыва класса, может быть, вы используете слишком плоские структуры данных?
Это может быть трудно сказать, потому что DTO, естественно, включают в себя большую семантическую повторяемость, которая оказывается вовсе не логическим повторением. Например, даже если у вас есть семантически похожие типы, если один является ViewModel, а другой - объектом домена, они могут иметь общую семантическую структуру, но несут совершенно разные обязанности.
Если, с другой стороны, у вас много повторений на том же уровне приложения (например, пользовательский интерфейс), возможно, вы нарушаете принцип СУХОЙ. В этом случае это может помочь инкапсулировать связанные данные в то, что начинается как плоская структура данных, в отдельный класс. В большинстве известных мне интерфейсов пользовательского интерфейса вы все же можете привязать данные к плоскому дисплею к иерархически структурированному классу.