2010-12-10 16 views
0

J'essaie de me frayer un chemin à travers WCF et dans mon exemple d'application l'exigence est de passer une classe entre mon site Web et mon nouveau service WCF.WCF Passing type complexe sans types communs dll

Je n'ai pas de DLL de type commun alors comment passer mon objet à travers le service?

Mon code ressemble à ceci;

Site

namespace HRO_Proof

{

[DataContract(Name = "ThrowAway", Namespace = "http://schemas.proof.com/throwaway/")] 
[KnownType(typeof(ThrowAway))] 
public class ThrowAway 
{ 
    public Int32 MyValue { get; set; } 

    public Boolean SomeFunc() 
    { 
     return true; 
    } 
} 

}

service WCF

namespace HRO_ServiceLibarary

{

public class StateService : IStateService 
{ 
    public Int32 SaveThrowaway(object throwAway) 
    { 
     //Save to DB 
     return 0; //Id of inserted record 
    } 

} 

}

J'ai lu un peu sur un DataContractResolver mais je ne sais pas comment je peux mettre en œuvre.

Toute aide de direction serait la bienvenue.

Merci, Mike

Répondre

0

Dans la marque de classe tous les membres DataMember. Les fonctions ne peuvent pas être marquées comme DataMember.

[DataContract] 
public class ThrowAway 
{ 
    [DataMember] 
    public Int32 MyValue { get; set; } 
} 

En service

public class StateService : IStateService 
{ 
    public Int32 SaveThrowaway(ThrowAway throwAway) 
    { 
     //Save to DB 
     return 0; //Id of inserted record 
    } 

} 

Maintenant, si vous souhaitez utiliser ce service dans votre site Web Ajouter référence Service et vous devriez obtenir la Throwaway classe dans la classe proxy

0

1) [KnownType(typeof(ThrowAway))]: KnownType attribut ayant le même type que la classe elle-même est inutile et implicitement appliqué. Vous n'en avez pas besoin.

2) Le type de paramètre de l'objet ne doit presque jamais être utilisé pour diverses raisons. En fait, vous avez besoin d'un [KnownType (typeof (ThrowAway))] sur la classe object mais vous ne possédez évidemment pas cette classe. Alors, obtenez une meilleure abstraction.

3) Comme Dinesh l'a dit, vous avez besoin de [DataMember] sur le public Int32 MyValue { get; set; }.

4) Si vous utilisez la génération de code en ajoutant une référence de service, vos méthodes resteront sur le serveur et ne le quitteront jamais. Mais si vous distribuez vos entités (ThrowAway) à votre client, elles le feront et c'est une bonne pratique. Rappelles toi! Séparez l'interface, les entités et l'implémentation dans une DLL distincte.