2009-04-15 5 views
3

Quelqu'un peut-il juste me dire comment créer un objet de Datacontract dans WCF.J'ai une application dans laquelle j'ai besoin d'un constructeur mais à côté du client quand je crée un objet, il ne montre pas un constructeur.Je sais une solution comme ajouter une classe partielle constructeurs containg.the confusion est ici "où ajouter une classe partielle"Constructeur dans wcf

S'il vous plaît quelqu'un m'aider ........ Je suis nouveau à C# et.

Répondre

0

Mon 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);  
} 

Dans mon WCF

Scheduler.cs

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

Dans le code généré, ce constructeur-t-il? Si une classe (non-abstraite, non statique) n'a pas de constructeur explicite, elle obtient un constructeur par défaut (public, sans paramètre). Alors quel code voyez-vous (pour cet objet) dans le code généré?

0

Le WSDL (langage de description de service Web) de votre service Web n'indique pas les informations constructeur de DataContract. La sérialisation s'applique uniquement aux champs [DataMember] dans vos classes DataContract. Par conséquent, le client généré n'inclut aucune méthode ou constructeur de votre DataContract, il a bien sûr un constructeur par défaut sans paramètre. Si vous voulez vraiment ajouter des constructeurs aux classes DataContract, vous pouvez ouvrir le fichier Reference.cs dans votre pli de référence Web dans votre solution, trouver la classe et la modifier. Notez que si vous mettez à jour votre référence Web, le code personnalisé sera remplacé.

Une autre solution comme votre dicton, a créé une classe partielle pour la classe DataContract générée. Vous saurez comment faire cela si vous inspectez le fichier reference.cs. (vous avez besoin de cliquer sur l'icône Afficher tout le fichier dans VS pour voir la référence.cs)

2

Pour faire ce que vous voulez, vous devez partager le type de contrat de données entre le client et le service. Il y a une option pour cela dans la boîte de dialogue "Ajouter une référence de service".

6

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.