Modèles de compensation du manque d’inheritance dans la SOA

Je trouve que l’inheritance et le concept de classe de base sont le point fort de la programmation orientée object. Mais cela n’est pas encouragé par la SOA. Alors, quels sont les modèles populaires pour surmonter cette limitation dans la SOA? Pourriez-vous s’il vous plaît fournir des tutoriels qui expliquent (avec la démonstration de code dans WCF) ces modèles?

Remarque: Il ne s’agit PAS d’une question générale sur les modèles disponibles dans SOA. Mais il est plus spécifique au problème mentionné ci-dessus.

Note: J’utilise WCF pour SOA.


En train de lire:

  1. “N’utilisez pas la classe de base abstraite dans Design; mais en modélisation / parsing ”

  2. Comment une architecture SOA est-elle réellement supposée être implémentée?

  3. Comment gérer le polymorphism de Java dans l’architecture orientée services

  4. Comment se mettre au diapason de la SOA?

  5. Qu’est-ce que l’architecture orientée services?

  6. Est-ce que DDD et SOA jouent vraiment bien ensemble?

  7. Questions de conception SOA et WCF: S’agit-il d’une conception de système inhabituelle?

  8. Conception de contrats et d’opérations de données WCF

  9. Expando Objects in C # 4.0

Que vous pensiez ou non à la SOA telle que mise en œuvre par SOAP, REST ou la messagerie, les services sont centrés sur le document. Les services ne sont pas orientés object .

Bien que le polymorphism soit un outil de conception puissant en OOD, il n’est pas applicable en SOA car la modélisation SOA n’implique aucune classe.

Je trouve que l’inheritance et le concept de classe de base sont le point fort de la programmation orientée object.

Ne surestimez pas le pouvoir de l’inheritance – presque tous les modèles GoF visent à éviter un mauvais usage de l’inheritance.

Mais cela n’est pas encouragé par la SOA.

Non, ce n’est généralement pas encouragé. Pourquoi? Parce qu’en SOA, vous disposez d’un service fournissant certaines opérations. Le service lui-même est défini par sa description (contrat / interface). Dans le cas de services SOAP, le contrat est décrit dans WSDL. Si vous avez besoin d’un autre service fournissant le même ensemble d’opérations avec un comportement légèrement différent, vous devrez simplement implémenter à nouveau l’interface et cibler le client vers un nouveau service (en fournissant une nouvelle URL de sharepoint terminaison). Ainsi, l’inheritance avec contrat de service “fonctionne” mais il ne fonctionne pas de la même manière avec les contrats de données.

Chaque opération de service accepte généralement certaines données et renvoie certaines données. Ces données sont à nouveau décrites dans la description du service. Dans le cas de services SOAP, les données sont décrites en tant que XSD. Lorsque vous envoyez des données de client à service (ou en sens inverse), les données doivent être sérialisées et la destination doit pouvoir les désérialiser (sauf si vous souhaitez utiliser directement des enveloppes SOAP ou si vous souhaitez utiliser xsd: any = XML non typé tel que transmis. Les données). Si vous souhaitez utiliser l’inheritance dans un contrat de données, vous devez en quelque sorte inclure des informations sur les contrats dérivés dans la description du service. Ce n’est qu’après avoir inclus ces informations dans la description de service que vous pouvez informer les consommateurs de services de l’existence de contrats de données hérités (ils ont besoin de ces informations pour travailler avec des types dérivés).

WCF offre la possibilité de travailler avec des contrats de données hérités. Vous pouvez utiliser KnownTypeAtsortingbute , l’atsortingbut DataContractResolver ou DataContractResolver . Vous pouvez également consulter cet excellent article pour plus de détails.

Dans le cas de systèmes non interopérables et à couplage NetDataContractSerializer (non SOA), vous pouvez également utiliser NetDataContractSerializer qui vous permet d’utiliser l’inheritance sans aucune limitation, car chaque message sérialisé contient des informations sur le type de CLR nécessaire à la désérialisation et les clients avec service doivent partager des ensembles de contrats de données.

L’une des raisons pour lesquelles l’inheritance n’est pas recommandé dans la SOA est que votre code est centré sur le modèle. Vous avez des modèles d’entrée et de sortie bien définis, et votre code doit être traduit entre les deux, et exécuter toute logique métier.

Avoir un inheritance signifierait simplement que les relations entre vos objects sont difficiles à modéliser et / ou à changer avec le temps. En gros, cela signifie utiliser des objects de modèle POCO.

Si vous souhaitez append une logique métier à votre utilisation, vous pouvez utiliser mixins pour imiter l’inheritance.