Разоблачение объектов (DataContracts), которые не могут быть напрямую использованы службой WCF?

У меня есть несколько классов объектов, которые используют наследование. Кажется, я могу получить доступ только к объектам, которые непосредственно используются службой. Позвольте мне показать вам, что я пытаюсь сделать:

[DataContract]
public class Object1
{
   [DataMember]
   int Id {get; set;}
}

[DataContract]
public class object2: Object1
{
   [DataMember]
   string Name {get; set;}
}

[DataContract]
public class object3 
{
    [DataMember]
    int SomeNumber {get; set;}
}

Сервис:

public int GetId(object2 obj)
{
    return GetTheId(object2.Name);
}

Теперь, поскольку я использую объект2 в службе, объект1 тоже сериализуется. Однако по какой-то причине я могу захотеть, чтобы объект object3 был выставлен. Это может быть производный класс, который я должен передать, чтобы его тип можно было определить позже для другого процесса. Я не вижу, чтобы этот объект сериализовался. Я предполагал, что всякий раз, когда вы устанавливаете DataContract/DataMember, эти объекты будут сериализованы. Имеет смысл не показывать то, что не используется, потому что я вижу проблему с раскрытием элементов, которые вам могут не понадобиться. Каков наилучший способ предоставления объектов, которые непосредственно не используются службой? Спасибо

Даниэль


person Community    schedule 06.04.2009    source источник


Ответы (2)


Вы должны украсить object2 (особое имя для класса :)) с помощью Атрибут KnownType:

[DataContract]
[KnownType(typeof(object3))]
public class object2 
{
}

Предполагая, что вы имеете в виду, что object3 является подклассом object2:

public class object3: object2
{
}
person Community    schedule 06.04.2009
comment
Я совсем забыл об этом атрибуте!!! Спасибо. Это то, что мне было нужно в этой ситуации. Спасибо!!!!! - person DDiVita; 07.04.2009
comment
Вы также можете украсить свой сервисный контракт [ServiceKnownType]. :) - person Anderson Imes; 15.04.2009

Я считаю, что вы ответили на свой вопрос. Если члены не используются службой, вы не должны раскрывать их. Всегда лучше предоставить минимальный набор данных, требуемых службой, так как в целом это повысит удобство сопровождения службы.

person Community    schedule 06.04.2009
comment
Точно, но как лучше всего показать объект, который не используется напрямую? - person DDiVita; 07.04.2009
comment
Не делай этого, это лучший способ. Единственное, о чем должен знать клиент от сервера, — это объекты, используемые сервисными операциями. - person John Saunders; 07.04.2009
comment
Это игнорирует тот факт, что наследование является реальностью в таких ситуациях. Это реальность как для контрактов, разработанных в коде, так и для контрактов, разработанных в схеме XML — вы должны определить унаследованные типы, чтобы клиент мог иметь определение для этого типа. - person Anderson Imes; 15.04.2009