Нужно ли выставлять конструктор в WCF DataContract, чтобы он работал во время создания объекта на клиенте? - PullRequest
9 голосов
/ 26 октября 2010

У меня есть класс в службе WCF, давайте назовем его A . A - это контракт данных, который содержит в качестве одного из своих членов DataMembers коллекцию другого пользовательского объекта B . Чтобы избежать проблем с нулевой ссылкой на стороне клиента, я создаю экземпляр BList в конструкторе следующим образом:

[DataContract]
public class A
{
    [DataMember]
    public String name { get; set; }
    [DataMember]
    public List<B> BList {get; set; }

    public A()
    {
        BList = new List<B>();  
    }
}

Моя проблема в том, что на клиенте такое создание не происходит, и BList отображается как ноль после создания на клиенте объекта A . Я предполагаю, что конструктор не появляется на клиенте. Итак, мне нужно сделать конструктор явным контрактом операции? Если так, это сделало бы внутренние вещи видимыми для клиента, которые они не должны видеть, верно? Как мне убедиться, что это создание экземпляра происходит на клиенте?

Спасибо, извините, если это кажется глупым вопросом.

Ответы [ 2 ]

3 голосов
/ 26 октября 2010

Вам необходимо использовать атрибуты [OnDeserializing] или [OnDeserialized] для инициализации типов DataContract.Смотри http://msdn.microsoft.com/en-us/library/ms733734.aspx

2 голосов
/ 26 октября 2010

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

  • Написать веб-метод, который возвращаетновый экземпляр вашего класса, и вы можете использовать его следующим образом, и я уверен, что ваш список инициализирован

Чтобы создать экземпляр:

A a = new ServiceClient.CreateAInstance();

В службе напишите метод

[OperationContract]
public A CreateAInstance()
{
     return new A();
}
...