Il existe deux façons de donner un constructeur à une classe DataContract. Le moyen le plus cohérent consiste probablement à déplacer le DataContract dans une bibliothèque de classes distincte que vous référencez dans votre service et votre client. Comme indiqué par John Saunders, il existe un moyen d'indiquer à Visual Studio d'utiliser une classe existante lors de la génération du code de proxy pour le service référencé. Après cela, vous pouvez simplement ajouter le constructeur à cette classe normalement.
Si vous souhaitez que le constructeur apparaisse uniquement du côté client ou pour toute autre raison, vous ne pouvez pas utiliser une bibliothèque de classes partagée, vous pouvez créer une classe partielle. Il n'y a vraiment pas de 'localisation' définie pour une telle classe. Tout ce qui est requis pour fournir le constructeur à travers une classe partielle est de créer un nouveau fichier de classe qui définit la même classe que votre proxy. Donc, en supposant que vous avez une classe proxy ReferencedServiceProxy.ContractClass vous devez créer un nouveau fichier de code qui définit la classe partielle
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
}
}
}
Tant que le fichier est compilé normalement, le compilateur fait tout le reste. Cependant, sans connaître le besoin d'un constructeur, il vaut probablement la peine de signaler qu'un constructeur n'est pas appelé lors de la désérialisation de l'objet côté client car l'objet n'est pas «construit» en tant que tel.
http://mehranikoo.net/CS/archive/2007/11/09/DataContractConstructorsInWCF.aspx a quelque chose lié à ce qui se passe pendant la désérialisation et comment l'affecter. Juste quelque chose que j'ai appris à la dure .. avec silverlight qui ne supporte même pas l'attribut OnDeserialization.