2010-10-25 9 views
9

Mam klasę w usłudze WCF, możesz ją nazwać A. A to umowa na dane, która zawiera jako jeden z jej modułów DataMembers kolekcję innego niestandardowego obiektu B. Aby uniknąć Null problemy odniesienia na stronie klienta, I instancji BList w konstruktorze tak:Czy muszę ujawnić konstruktora w WCCont DataContract, aby działał podczas tworzenia obiektu na kliencie?

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

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

Moim problemem jest to, że na kliencie, to instancji nie stało i BList pojawia się jako zerowy po obiekt A jest tworzony na kliencie. Zgaduję, że konstruktor nie pojawia się na kliencie. Więc czy muszę uczynić konstruktora wyraźną umową o operację? Jeśli tak, to wewnętrzne rzeczy będą widoczne dla klienta, którego nie powinny widzieć, prawda? Jak upewnić się, że to wystąpienie dzieje się na kliencie?

Dziękuję i przepraszam, jeśli wydaje się to głupie pytanie.

Odpowiedz

2

Nie jestem pewien, czy istnieje sposób, aby to zrobić, ale przez coraz nowe wystąpienie ze służby lista powinna zostać zainicjowana, proponuję następujące

  • napisać metodę internetową, która zwraca nową instancję swojej klasie i można go używać jak poniżej i jestem pewien, czy lista jest inicjowany

Aby utworzyć instancję:

A a = new ServiceClient.CreateAInstance(); 

W służbie napisać metodę,

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

Dzięki. Prawdopodobnie zadziała, ale obciąży klienta, zmuszając go do wywołania metody sieciowej po prostu do utworzenia instancji obiektu. –

3

Trzeba użyć [OnDeserializing] lub [OnDeserialized] atrybuty zrobić inicjalizacji typów DataContract. Zobacz http://msdn.microsoft.com/en-us/library/ms733734.aspx

+0

Niestety, właśnie zobaczyłem, że problem jest głębszy - chcesz, aby * zachowanie * inicjalizacji BList zostało przeniesione na klienta. Niestety, nie ma na to interoperacyjnego sposobu (XSD/WSDL/etc nie pozwalają na opisanie takiej semantyki), ale możesz oczywiście dzielić się typami (np. Umieść swoje typy w MyDataContracts.dll i wykonaj svcutil /r:MyDataContracts.dll) jeśli nie masz nic przeciwko zerwaniu naprawdę rozłączonego/SOA natury twojego rozwiązania ... –

Powiązane problemy