2013-01-06 10 views
5

Z tego co widzę, muszę stworzyć „specjalny” typ danych dla każdego rodzaju danych Chcę przenieść nad WCF, więc jeśli mają wspólną klasę jakUżyj wspólny typ danych jako DataContract w WCF

public class District 
{ 
    public long Id { get; set; } 
    public string Name { get; set; } 
} 

i chcę wysłać obiekt Rejonowego przy użyciu WCF, muszę utworzyć DataContract i dlatego trzeba utworzyć nową klasę WCF

[DataContract] 
public class WCFDistrict 
{ 
    [DataMember] 
    public long Id { get; set; } 

    [DataMember] 
    public string Name { get; set; } 
} 

a kiedy używam go w usług WCF w moim realizacji i należy przeanalizować dane z jednego obiektu na inny

public WCFDistrict GetDistrict(long id) 
{ 
    var district = _districtRepository.GetDistrict(id); 
    return new WCFDistrict {Id = district.Id, Name = district.Name}; 
} 

Czy jest jakiś sposób, aby ponownie użyć klasy współużytkowanej jako DataContract, bez posiadania tych atrybutów? A może powinienem utworzyć interfejs na zajęciach, którymi mogą się dzielić, więc mogę po prostu je przesłać? A może coś trzeciego?

Odpowiedz

9

Po pierwsze, nie jest wymagane dostarczenie DataContract; WCF będzie poprawnie serializować zwykłe stare obiekty klas (POCO) tak długo, jak długo będziesz na .Net 3.5 SP1 lub nowszym.

Po drugie, można udostępniać ten sam plik klasy fizycznej w projektach po stronie serwera i klienta; mamy projekty, które mają setki klas (i kodu), które są bezpośrednio udostępniane w ten sposób i oszczędza ogromną ilość czasu i wysiłku w rozwoju i testowaniu.

Istnieje kilka etapów wymaganych, aby uzyskać ten uruchomiony (robi to z pamięci, więc może trzeba dostosować odpowiedź):

1) po stronie klienta, jeśli używasz VB, stworzyć projekt w tej samej domyślnej przestrzeni nazw co klasy, które chcesz użyć po stronie klienta (dla języka C# to nie jest ważne, ponieważ przestrzeń nazw jest osadzona w klasach).

2) Dodaj pliki zajęć do projektu jako odnośniki, aby mieć jedną fizyczną kopię tej klasy.

3) Dodaj dataContractSerializer do konfiguracji WCF, jeśli jeszcze jej nie masz.

4) Po stronie klienta kliknij prawym przyciskiem myszy usługę i wybierz polecenie Skonfiguruj odniesienie do usługi ... W wyświetlonym oknie dialogowym sprawdź, czy jest zaznaczone Reuse types in all referenced assemblies i czy wybrana jest opcja Reuse types in all referenced assemblies.

5) Najtrudniejszą rzeczą do uzyskania tej pracy są kolekcje.

a) Udekoruj kolekcję atrybutem CollectionDataContract.

b) Dodaj wpis dotyczący tej kolekcji do tabeli reference.svcmap o numerze CollectionMappings. Aby znaleźć plik reference.svcmap, pokaż wszystkie pliki w projekcie, a następnie rozwiń usługę. Aby go edytować, wystarczy dwukrotnie kliknąć plik.Tutaj dodasz wpis dla każdej konkretnej kolekcji, która jest serializowana, i musisz rozróżnić te elementy, które mają Bazę <> i te, które mają Bazę Słownika <>. Jeśli nie wykonasz tego kroku, WCF automatycznie serializuje te klasy z podstawowym ogólnym podpisem, a stracisz korzystanie ze swoich klas.

Wpisy w tej tabeli wyglądać następująco:

<CollectionMappings> 
    <CollectionMapping TypeName="System.Collections.Generic.Dictionary`2" Category="Dictionary" /> 
    <CollectionMapping TypeName="System.Collections.Generic.List`1" Category="List" /> 
    <CollectionMapping TypeName="System.Collections.Specialized.StringCollection" Category="List" /> 
    <CollectionMapping TypeName="My.Namespace.MyDictionaryCollection" Category="Dictionary" /> 

Po dodaniu tych wpisów i zapisać plik, generator po stronie klienta WCF będzie odbudować reference.cs lub plik reference.vb zależności od z jakiego języka korzystasz. Możesz sprawdzić, czy nie masz poprawnie skonfigurowanych referencji, patrząc na wygenerowany kod: jeśli ten kod zawiera definicje klas, generator kodu WCF nie mógł z jakiegoś powodu mapować na skopiowane klasy.

Ostatnia uwaga: czasami generator kodu WCF kompletnie nie generuje kodu i jest to zawsze spowodowane problemem w usłudze (zazwyczaj klasa nie jest wystarczająco unikatowa lub typ nie może być serializowany dla jednego z tego czy innego powodu).

W celu debugowania tego typu problemu, najłatwiejszym rozwiązaniem jest dodanie rejestrowania diagnostycznego WCF, które wygeneruje plik, który można otworzyć za pomocą specjalnego narzędzia (zapomnieć o jego nazwie), które pozwala na drążenie w komunikaty o błędach i odkryj dokładnie, co poszło nie tak. To uratowało nam niezliczone godziny pracy. Aby skonfigurować tę rejestrację, należy dodać następujące do pliku web.config w dowolnym miejscu w sekcji <configuration>:

<system.diagnostics> 
    <sources> 
     <source name="System.ServiceModel" 
       switchValue="Information, ActivityTracing" 
       propagateActivity="true"> 
     <listeners> 
      <add name="traceListener" 
       type="System.Diagnostics.XmlWriterTraceListener" 
       initializeData="c:\log\WcfTrace.svclog" /> 
     </listeners> 
     </source> 
    </sources> 
    </system.diagnostics> 

Po dodaniu tego i zapisywane Web.config próbę zaktualizowania odniesienia serwisowa w kliencie, a następnie dwukrotnie kliknij określony plik dziennika, a narzędzie otworzy się.

4

Będziesz potrzebować tych atrybutów. Aby ułatwić Ci życie, możesz użyć narzędzia takiego jak AutoMapper, aby wykonać okablowanie obiektów transferu danych, ponieważ ręczne ustawienie wszystkich właściwości może być uciążliwe.

W każdym razie dobrą praktyką jest oddzielanie klas modeli od umów dotyczących danych, aby zmiany wprowadzone w modelu nie miały bezpośredniego wpływu na umowy dotyczące danych.