Я действительно не начинал понимать, почему или как вы будете отделять модель предметной области от проблем презентации, пока я не начал следить за работой Грега Янга и Уди Даана (через Мартина Фаулера).
Они обучают принципу, известному как Разделение ответственности за команды и запросы (CQRS).
Моя интерпретация CQRS заключается в том, что есть два набора обязанностей, которые могут тянуть модель предметной области в разных направлениях, что приводит к модели, которая выполняет посредственную работу с обоими. Двумя обязанностями являются команды (то есть поведение, которое может вызвать запись в базу данных) и запросы (то есть чтение из базы данных для извлечения данных для использования пользовательского интерфейса). Примером может быть добавление геттеров и сеттеров к вашим сущностям для поддержки привязки данных в пользовательском интерфейсе. Если в вашей модели есть геттеры и сеттеры, она, вероятно, плохо справится с моделированием изменений состояния, которые должны происходить транзакционно или инкапсулировать бизнес-логику. Он также не сможет моделировать бизнес-контекст изменений состояния (см. Event Sourcing).
В терминах DDD можно сказать, что модель предметной области и модель представления обычно находятся в отдельных ограниченных контекстах.
Решение, предписанное CQRS, заключается в создании одной модели для команд, а другой - для запросов. Если ваша текущая модель имеет методы для изменения состояния (то есть поведения в модели) и методы получения, которые представляют состояние для пользовательского интерфейса для привязки данных, вы бы реорганизовали эти две обязанности в отдельные модели для команд и запросов. Модель запроса будет отображаться не на ваши доменные объекты, а непосредственно на базу данных. Если ваша база данных не захватывает производное состояние из вашей доменной модели, проверьте шаблон под названием Eager Read Derivation .
Если ваша система просто CRUD и не имеет поведения, попробуйте систему скаффолдинга, которая может быть автоматически построена из вашей схемы базы данных, например ASP.NET Dynamic Data