Это много вопросов, но вы правы, когда задаете их, потому что они очень важны, когда вы начинаете смотреть, как передавать объекты между слоями.
Давайте начнем с
«Как это обычно делается?»
Вы справедливо отметили, что способ представления объекта домена пользователю не всегда в необработанном виде - иногда вы хотите показать его чуть меньше, как в примере с пользователем, где добавление ролей может в другом пользовательском интерфейсе, отличном от пользовательского создания / модификации, иногда вы хотите показать немного больше, отображая 2 объекта одновременно или представляя смешанные данные, например, из 2 объектов.
Кстати, небольшая точность: вы считаете, что вариант 1 (несколько окон) больше привязан к модели предметной области, хотя я думаю, что он имеет тенденцию имитировать модель меньше, поскольку он не представляет весь объект предметной области в одном экран, но это деталь.
Так как вы обычно справляетесь с этим? Точно так, как вы сказали, создавая специфичные для пользовательского интерфейса объекты, приспособленные для ваших представлений
Единственное чистое решение, о котором я могу подумать, - это создание классов для использования в
пользовательский интерфейс, который будет имитировать информацию в реальном домене
объекты. Так что я смогу создать пустого пользователя для добавления ролей, затем
установите userId после этого.
Их часто называют DTO , объектами ViewModel в мире .NET / MVVM и т. Д.
Пользовательский интерфейс может использовать эту информацию для создания реального домена
Objet.
Обычно сам пользовательский интерфейс не несет ответственности за создание / обновление объектов домена из объектов пользовательского интерфейса. Сопоставление выполняется в другом слое.
Теперь, когда мы увидели базовое решение, давайте посмотрим, как оно необычно удалось;)
Есть несколько альтернатив. Одним из них является шаблон Naked Objects , где все пользовательские интерфейсы являются прямыми представлениями объектов домена. Это сильно упрощает проблему, но еще предстоит выяснить, являются ли такие интерфейсы всегда лучшими с точки зрения рабочего процесса и простоты использования.
Или вы могли бы уйти, просто используя ваши доменные объекты на уровне представления. Это недавнее сообщение указывает на проблемы, которые возникают, когда у вас есть несколько представлений одного и того же объекта, и исследует возможность использования одних и тех же доменных объектов во всех слоях. Проблема здесь в том, что вам, возможно, придется втиснуть некоторые данные в объекты вашего домена, которые не связаны исключительно с доменом, и вам, возможно, придется отказаться и от некоторых инвариантов (например, «пользователь не может существовать, если ему не назначена роль» ", если вы разделяете пользовательский интерфейс создания и назначения ролей).
Наконец, чтобы вернуться к примеру пользователя / роли и «Я не вижу, как я могу добавить роли, если пользователь еще не создан»: вам не нужно иметь существующий объект User для конечного пользователя ваше приложение, чтобы иметь возможность выбирать роли. Вы можете просто выбрать роли на экране и удерживать их до тех пор, пока фактическое создание объекта User не будет завершено, и при этом применять все обязательные поля, такие как ID.