2010-08-19 5 views
12

Je rencontre des difficultés avec un service WCF RIA similaire au problème spécifié dans this thread.Ria Services Passing Complex Object en tant que paramètre d'une méthode de service de domaine de requête

La méthode domainservice que je crée (méthode Query) doit prendre un paramètre d'objet complexe. exemple méthode DomainService:

public ComplexObjectResult GetComplexObject(ComplexObjectParameter test) 
    { 
     //do stuff 
    } 

l'objet de paramètre:

public class ComplexObjectParameter 
{   

    [Key] 
    public decimal ID { get; set; } 

    ... other fields 
} 

Je reçois cette erreur de compilation: Erreur 70 Paramètre 'test' d'entrée de fonctionnement de domaine 'GetComplexObject' doit être l'un des sérialisable prédéfini types.

Après quelques recherches sur le web j'ai trouvé this msdn thread. Il indique qu'il s'agit d'une limitation des services RIA et que le thread ne spécifie aucune solution de contournement décente.

Maintenant, il semble y avoir quelques solutions de contournement sales:

  • Modifier le paramètre complexe à type de chaîne et linéariser/désérialiser le parameterobject que je trouve nous-même une solution très hacky. Utilisez la balise [Invoke] sur la méthode de service de domaine et perdez toutes les fonctionnalités de suivi RIA, pour lesquelles j'utilise RIA en premier lieu.

Y a-t-il des alternatives pour les solutions mentionnées qui ont moins d'inconvénients? Est-ce que quelqu'un a trouvé une solution de contournement plus élégante pour ce problème?

Merci

+0

Je suis allé avec votre deuxième option Stephane. Les types complexes que j'ai renvoyés étaient en lecture seule sur le client, de sorte que la perte de la fonctionnalité de suivi n'était pas un problème pour moi. Envisager de mettre des solutions potentielles (même sales) en réponse la prochaine fois ... J'aurais voté à la fois pour la question et la réponse alors! –

Répondre

6

de contournement sale trois, est d'utiliser l'attribut [Invoke] et ajouter une méthode au service de domaine pour exposer le « type complexe », qui informe l'outillage WCF RIA pour créer l'entité sur le client -side:

public ComplexObjectParameter ExposeComplexObjectParameter() 
{ 
    throw new NotSupportedException(); 
} 

je mets NotSupportedException dans mes méthodes de service de domaine pour prévenir les défaillances silencieuses si la méthode est toujours appelé à distance.

Je ne suis pas sûr de savoir comment cette solution affecte le problème de perdre "toutes les fonctionnalités de suivi RIA". Il ne répond pas comment créer une requête composable en utilisant un type complexe en tant que paramètre.

Il est sale, mais résume le problème le plus proche de la source du problème. Le code d'appel et de réception est plus propre. Cela maintient "l'élégance" au niveau supérieur tout en poussant le sale.

+1

Salut Ed, j'avais déjà créé une fausse méthode de requête pour avoir l'objet complexparameter généré sur le client.Cela fait partie de la solution 2 sale. Mais j'ai fini par utiliser encore une autre solution: persister le paramètre complexe d'objet à la base de données, et juste passer l'id lors de l'interrogation. Cette solution peut ne pas être applicable à toutes les personnes rencontrant ce problème, mais cela convient à mon cas. Merci pour votre effort. – Stephane

+0

Un vote pour expliquer que vous devez «exposer» le type complexe. –

2

Super vieille question, je sais. Mais j'ai juste eu un peu par là, et j'ai trouvé une réponse. De la MSDN Docs sur ComplexObject:

But a ComplexObject differs from an Entity in important ways. In particular, complex types do not have identities. This means that they do not have members marked with the KeyAttribute and so clients cannot do identity caching for them as it does for entities. Complex types cannot be shared or referenced from multiple parent instances and they do not support inheritance.