WCF DataContract на абстрактный базовый класс и его подклассы - PullRequest
0 голосов
/ 08 апреля 2011

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

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, и хочу предотвратить создание экземпляра Update, поэтому оно абстрактно. Я хочу, чтобы одна реализация для моего поколения AppId и для производных классов не беспокоилась об этом или не изменяла его, поэтому AppId доступен только для чтения.

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

Ответы [ 3 ]

1 голос
/ 08 апреля 2011

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

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

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

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

0 голосов
/ 08 апреля 2011

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

Для примера использования NetDataContractSerializer: WCF Serializer контракта данных Net

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...