2009-04-15 5 views
3

Kann mir jemand sagen, wie man ein Objekt von Datacontract in WCF.Ich habe eine Anwendung, in der ich brauche einen Konstruktor, aber auf der Clientseite, wenn ich ein Objekt erstellen, zeigt es nicht einen Konstruktor.Ich weiß eine Lösung wie fügen Sie eine partielle Klasse contalling Konstruktoren. Die Verwirrung ist hier "wo eine partielle Klasse hinzufügen"Konstruktor in wcf

Bitte jemand helfen mir ........ Ich bin neu in C# und .net.

Antwort

0

In My WCF

ITestPointSrv.cs

[ServiceContract]  
public interface ITestPointSrv  
{  
    [OperationContract] 
    DataTable GetMonthEvents(Int32 p_nYear, Int32 p_nMonth); 
} 

TestPointSrv.svc.cs

public DataTable GetMonthEvents(Int32 p_nYear, Int32 p_nMonth)  
{  
    return (new OccasionType()).GetMonthEvents(p_nYear, p_nMonth);  
} 

In My WCF

Scheduler.cs

TestPointSrvClient srv = new TestPointSrvClient();  
DataTable dtEvents = srv.GetMonthEvents(this.dtpMonth.Year, 
    this.dtpMonth.Month); 
0

Im Code erzeugt, welche Konstruktor hat es? Wenn eine (nicht abstrakte, nicht statische) Klasse keinen expliziten Konstruktor hat, erhält sie einen Standardkonstruktor (public, parameterless). Welchen Code sehen Sie (für dieses Objekt) im generierten Code?

0

Die WSDL (Web-Service-Beschreibungssprache) Ihres Web-Service zeigt die Konstruktordaten von DataContract nicht an. Die Serialisierung gilt nur für die Felder [DataMember] in Ihren DataContract-Klassen. Daher enthält der generierte Client keine Methoden oder Konstruktoren von DataContract, sondern nur einen parameterlosen Standardkonstruktor.

Wenn Sie den DataContract-Klassen wirklich Konstruktoren hinzufügen möchten, können Sie die Reference.cs-Datei in Ihrer Webreferenz in Ihrer Lösung öffnen und die Klasse suchen und ändern. Hinweis: Wenn Sie Ihre Webreferenz aktualisieren, wird der benutzerdefinierte Code überschrieben.

Eine andere Lösung, wie Sie sagen, hat eine partielle Klasse für die generierte DataContract-Klasse erstellt. Sie werden wissen, wie das geht, wenn Sie die referenz.cs-Datei überprüfen. (Sie müssen auf Alle Dateisymbol in VS anzeigen klicken, um die Referenz zu sehen.cs)

2

Um zu tun, was Sie wollen, müssen Sie den Datenvertragstyp zwischen dem Client und dem Dienst teilen. Dafür gibt es im Dialogfeld "Service-Referenz hinzufügen" eine Option.

6

Es gibt zwei Möglichkeiten, um einer DataContract-Klasse einen Konstruktor zu geben. Der wahrscheinlich konsistenteste Weg ist, den DataContract in eine separate Klassenbibliothek zu verschieben, auf die Sie in Ihrem Service und Client verweisen. Wie von John Saunders angegeben, gibt es eine Möglichkeit, Visual Studio mitzuteilen, eine vorhandene Klasse beim Generieren des Proxy-Codes für den referenzierten Dienst zu verwenden. Danach können Sie den Konstruktor einfach zu dieser Klasse hinzufügen.

Wenn der Konstruktor nur auf der Clientseite angezeigt werden soll oder aus anderen Gründen keine gemeinsam genutzte Klassenbibliothek verwenden kann, können Sie eine partielle Klasse erstellen. Es gibt wirklich keinen definierten "Ort" für eine solche Klasse. Alles, was erforderlich ist, um den Konstruktor über eine partielle Klasse bereitzustellen, besteht darin, eine neue Klassendatei zu erstellen, die dieselbe Klasse wie Ihr Proxy definiert.

Also vorausgesetzt, Sie haben eine Proxy-Klasse ReferencedServiceProxy.ContractClass Sie benötigen eine neue Code-Datei zu erstellen, die die partielle Klasse

namespace ReferencedServiceProxy 
{ 
    partial class ContractClass 
    { 
     // Constructor. Naturally the constructor cannot overwrite one 
     // defined in the proxy class already. Not sure if those define 
     // a default constructor. 
     public ContractClass() 
     { 
      // Implementation 
     } 
    } 
} 

Solange die Datei normalerweise kompiliert wird, der Compiler, den Rest macht definiert.

Ohne jedoch die Notwendigkeit eines Konstruktors zu kennen, ist es wahrscheinlich erwähnenswert, dass ein Konstruktor nicht aufgerufen wird, wenn das Objekt auf der Clientseite deserialisiert wird, da das Objekt nicht als solches "konstruiert" wird.

http://mehranikoo.net/CS/archive/2007/11/09/DataContractConstructorsInWCF.aspx hat etwas mit dem, was während der Deserialisierung passiert und wie man es beeinflusst. Nur etwas, was ich auf die harte Art gelernt habe. Mit silverlight, das nicht einmal das OnDeserialization-Attribut unterstützt.