2009-06-04 8 views
1

Je suis en train d'écrire quelques services WCF qui exposent des données récupérées à partir d'Entity Framework, et en suivant les modèles de conception pilotée par domaine, j'ai un référentiel par agrégat. L'exemple concret est une collection de questions et de réponses. Il y a un QuestionRepository et un AnswerRepository.Utilisation du même contrat de données entre services

Je rencontre des problèmes lorsque je souhaite transférer des éléments de QuestionRepository vers AnswerRepository. Comme les deux services sont soutenus par le même modèle de données, ils utilisent les mêmes éléments logiques, mais svcutil les place dans deux espaces de noms différents et les traite comme des services complètement différents.

Y at-il un moyen de contourner ce problème? Est-il possible d'héberger deux ServiceContracts dans le même service? Est-il possible que WCF réutilise les contrats de données générés par un autre service?

Merci, Roy

Répondre

2

Vous devriez certainement pouvoir avoir un DataContract commun utilisé par deux services distincts, IQuestionService et IAnswerService.

Possédez-vous les deux extrémités du fil, par ex. à la fois client et serveur? Les deux .NET/WCF? Dans ce cas, vous pourriez, par exemple, placez votre DataContract et toutes vos interfaces communes dans un seul ensemble séparé et partagez cet assembly entre les deux services, à la fois sur le serveur et sur le client.

Sur le client, si vous exécutez svcutil, vous pouvez lui indiquer d'utiliser des types de cet assembly commun donné, par ex. dites le PAS pour recréer vos types de données Question et Answer, mais utilisez ceux de votre assembly. Consultez le paramètre /reference (ou /r) de svcutil.

svcutil (your WSDL) /r (your common assembly here) ...... 

Ou l'autre option serait de sauter svcutil tous ensemble et créer votre ChannelFactory etc. et vous instancier votre client 100% manuellement, sans référence de service, etc.

ChannelFactory<IQuestion> cFac = 
    new ChannelFactory<IQuestion>("ConfigName"); 
IQuestion proxy = cFac.CreateChannel(); 

puis utilisez la proxy objet comme celui que vous utilisez maintenant généré par svcutil.

Cela ne fonctionne bien sûr que si vous possédez les deux extrémités du fil.

Marc

0

je crois qu'il ya une chose qui pourrait vous aider est de jeter un oeil à la classe DataContractAttribute qui vous permettent de spécifier le nom et l'espace de noms pour la sérialisation. Cela dit, si vous utilisez les mêmes éléments logiques, cela devrait suffire à les rendre compatibles entre les services.

Tout dépend du WSDL généré par le point de terminaison MEX.

Questions connexes