Сериализация WCF с наследованием объектов? - PullRequest
5 голосов
/ 18 марта 2009

У меня есть два объекта, один находится на уровне нашего предприятия, а другой - на уровне нашего обслуживания. Сервисный объект наследуется от предприятия. Вот быстрый пример:

[DataContract]
public class EnterpriseObject{
     [DataMember]
     int ID{get; set;}

     string InternalUse{get; set;}
}

[DataContract]
public class ServiceObject: EnterpriseBaseObject{
     [DataMember]     
     string Address{get; set;}
}

Возможно ли выставить ServiceObject только (с унаследованными свойствами от EnterpriseObject) в сериализации? Я не хочу, чтобы клиент видел объект предприятия в списке в качестве опции? Как видно из примера, атрибут DataMember не установлен для свойства InternalUser. Это единственный способ сделать это? Спасибо

Ответы [ 2 ]

7 голосов
/ 18 марта 2009

Вы обрабатываете наследование, добавляя [KnownType(typeof(ServiceObject))] к EnterpriseBaseObject - однако, EnterpriseBaseObject все еще является частью договора, и его существование будет общедоступным. Но будут опубликованы только участники, отмеченные [DataMember].

Один из вариантов (для удаления наследования) состоит в том, чтобы иметь отдельный DTO для целей сериализации и иметь преобразование между версией DTO и фактической версией, но это требует дополнительной работы.

2 голосов
/ 18 марта 2009

Можете ли вы изменить это с Is A на Has? Если ServiceObject имеет EnterpriseObject, вы можете предоставить только те свойства, которые вам нужны.

Редактировать

Если я правильно понимаю, вы хотите предоставить ServiceObject клиентам, включая все его свойства (помеченные как DataMember), включая свойства, унаследованные от EnterpriseObject. Но вы не хотите, чтобы клиент знал, что существует объект с именем EnterpriseObject.

Вы можете сделать это, скрыв тот факт, что есть объект предприятия. Вместо использования отношения «Is A», которое является паттерном наследования. Вы можете использовать композицию или шаблон «Имеет A».

public class ServiceObject
{
   private EnterpriseObject _myEntObject;

   public string MyServiceObjectProperty
   {
      get;
      set;
   }

   public string MyEntObjectProperty
   {
     get { return _myEntObject.MyEntObjectProperty;}
   }
}

Теперь вы изолировали ваш EnterpriseObject от вашего клиента. Все ваше общение заключается в том, что ServiceObject имеет некоторые свойства, которые вы не предоставляете своему клиенту, что это реализовано на сервере другим объектом.

Это также похоже на наличие DTO, единственной целью которого является передача данных. DTO позволяют скрыть вашу реализацию, предоставляя вашим клиентам именно то, что им нужно, в нужном формате, не раскрывая ваши внутренние объекты.

...