Лучший подход к представлению данных из доменных моделей через сервисы WCF
У меня есть большая коллекция моделей предметной области в основной библиотеке, которая также содержит методы для получения различных наборов моделей. Несколько сервисных проектов WCF ссылаются на эту библиотеку и публикуют наборы, например
GetProducts(int categoryId)
Мой первоначальный подход состоял в том, чтобы украсить доменные модели атрибутами DataContract и DataMember и вернуть их из методов службы WCF. Однако я вижу недостаток в этом подходе, так как теперь некоторые сервисы хотят, чтобы разные свойства модели были сериализованы для других.
Я думаю, что у меня есть 2 варианта:
В каждом проекте WCF создайте классы DTO с необходимыми свойствами и атрибутами для этого проекта и верните их из методов службы. Создайте DTO из моделей предметной области. Это похоже на "правильный" подход, но требует очень много времени на настройку и поддержку по мере расширения моделей предметной области.
Напишите мой собственный сериализатор xml, который динамически выбирает, какие свойства моделей доменов сериализовать во время выполнения, в зависимости от проекта. Я понятия не имею, возможно ли это вообще!
(Я также рассмотрел "хитрость" установки свойств, которые я не хотел сериализовать в их значения по умолчанию, а затем изменить их обратно после сериализации, но это слишком неудобно и пахнет плохо)
Есть ли другой подход или есть способ уменьшить ручную работу, связанную с #1?
2 ответа
Подход № 1 в правильном. Разработайте DTO так, чтобы они отвечали требованиям клиента, и убедитесь, что он отлично работает с WCF.
Отображение из доменных объектов в DTO - это то, что может быть значительно упрощено с помощью сопоставления объектов с объектами. AutoMapper является распространенным выбором в проектах.NET. Это гибкий и имеет хорошие характеристики.
Есть вариант 2b. Если вы помечаете объекты с помощью [DataContract], а свойства с атрибутами [DataMember], то только те из них будут сериализованы.
Я использовал этот подход с некоторым успехом. Вопрос в том, действительно ли это всегда те же свойства, которые вы хотите сериализовать. Например, если у вас есть доступ к объекту адреса, а затем все в классе адреса общедоступно, это жизнеспособно. Даже если вы внутренне сохраните набор географических координат для некоторого алгоритма расстояния, который вы не выставите.
Однако, если некоторые люди это делают, а некоторые не имеют доступа к полному номеру кредитной карты клиента, то такой подход будет проблемой, если вы попытаетесь сериализовать клиента. (доступ к адресу клиента все еще может быть определен отдельно, если адрес является отдельным объектом).
Возможно, не лучший пример с точки зрения DDD, поскольку адрес, вероятно, не будет сущностью, но я надеюсь, что вы понимаете мои соображения