Во-первых, я хотел бы заверить вас, что вполне нормально иметь другую модель в реализации сервиса по сравнению с моделью уровня сервиса. Есть несколько причин, почему это может произойти и / или полезно, две из которых:
- Вы не хотите показывать всю свою реализацию, но, возможно, просто подмножество. Это сценарий, который вы описываете.
- Вы нашли лучшую абстракцию для домена, который вы хотите использовать для реализации своего сервиса, но который будет слишком сложен для понимания пользователями вашего сервиса.
В моем опыте обе причины верны и обе имеют значение. Вместе со своей командой я часто называю модель, используемую в качестве уровня обслуживания, как «Модель домена уровня обслуживания». Я уверен, что есть и другие, лучшие имена.
Создайте все типы (интерфейсы, классы, структуры, перечисления), которые вы не хотите предоставлять внутренним для сборки, реализующей их. Затем создайте дубликаты - это могут быть DTO (объекты передачи данных) или другие - для фрагментов, которые вы хотите показать, но дублируйте только данные, а не реализацию. В зависимости от реализации вы можете использовать некоторое основанное на отражении волшебство для обмена данными между внутренним и внешним представлением. Помните о возможных последствиях производительности. Копирование данных осуществляется по цене.
Кроме того, вместо перемещения данных клиенту службы и обратно в службу вы также можете определить операции с этими данными, которые могут быть выполнены службой. Таким образом, во-первых, вы избежите проблемы.
Удачи!