2011-04-08 2 views
0

У меня есть приложение для мониторинга, которое получает обновления обработки из других приложений через WCF. Раньше наблюдаемые приложения имели один класс «обновления» для отправки данных в приложение мониторинга. Сейчас я пишу абстрактный базовый класс, который выглядит как этотWCF DataContract для абстрактного базового класса и его подклассов

public abstract class Update 
{ 
    public readonly DateTime TimeStamp; 
    public readonly int  AppId; 

    public Update() 
    { 
     TimeStamp = DateTime.Now; 
     AppId = SomeMethodThatCalculatesId(); 
    } 

    private int SomeMethodThatCalculatesId() 
    { 
     // my calculations ... 
    } 
} 

Вот пример подкласс

public class ProcessUpdate : Update 
{ 
    public readonly string ProcessMessage; 

    public ProcessUpdate(string processMessage) : base() 
    { 
     if (string.IsNullOrEmpty(processMessage)) 
     { 
      throw new ArgumentNullException("processMessage"); 
     } 

     ProcessMessage = processMessage; 
    } 
} 

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

Нужно ли Update атрибут тега атрибута DataContract или требуется только для моих подклассов? Если это так, могу ли я по-прежнему украшать TimeStamp и AppId с DataMemeber без DataContract и все еще получать доступ к этим свойствам в приложении мониторинга?

ответ

1

Я думаю, что эта рекомендация ВМК является общение через интерфейсы. В вашем случае это означало бы создание TimeStamp и AppId свойств интерфейса (украсить то, что с DataContract) и украсить их DataMember, тогда вы должны реализовать этот интерфейс в Update.

В ситуации, о которой вы говорите, если вы хотите видеть объекты Update над WCF, тогда вам нужно украсить ее DataContract, и если вы хотите, чтобы вы могли видеть только поля для чтения, вам нужно украсить их с DataMember.

+0

Итак, если я получу это правильно, Update и ProcessUpdate необходимо DataContract. Хотя IUpdate понадобится DataMember для своих свойств. Это верно? – jlafay

+0

Или я мог бы просто украсить ProcessUpdate с помощью DataContract, так как Update никогда не пройдет через провод. – jlafay

0

Вы должны пометить все классы DataContract и всех членов, которые хотите передать в качестве DataMember. Кроме того, вы должны использовать сериализатор NetDataContract, иначе вы не сможете передавать иерархии классов или интерфейсы через WCF.

Для примера использования NetDataContractSerializer: WCF Net Data Contract Serializer

1

Вы можете отметить услугу ServiceKnownType, чтобы рассказать клиенту о подклассах, что должно заставить его работать, когда вы отправляете вещи, полученные из обновления.

Что касается маркировки Обновление как абстрактное на клиенте, а не при использовании службы на основе XML. На другом конце он не видит Обновление как абстрактное.

+0

Он не должен видеть объект Update вообще, потому что вы не можете создавать экземпляр в абстрактном классе. Будет ли он работать, если WCF принимает объект как IUpdate? – jlafay

+0

Это не так, как это работает. Если у вас есть метод, который возвращает Update, даже если Update является абстрактным, на другом конце службы XML они будут видеть Update и смогут его создать. Эти данные не перекликаются при создании клиентского прокси. – Tridus

Смежные вопросы