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.