Je souhaite poser quelques questions sur les meilleures pratiques concernant les types de mappage et l'utilisation des méthodes d'extension en C #. Je sais que ce sujet a été discuté plusieurs fois au cours des dernières années, mais j'ai lu beaucoup de messages et j'ai encore des doutes.
Le problème que j'ai rencontré était d'étendre la classe que je possède avec la fonctionnalité "convertir". Disons que j'ai la classe "Person" qui représente un objet qui sera utilisé par une logique. J'ai également une classe "Client" qui représente une réponse de l'API externe (en fait, il y aura plus d'une API, j'ai donc besoin de mapper la réponse de chaque API au type commun: Personne). J'ai accès au code source des deux classes et je peux théoriquement y implémenter mes propres méthodes. J'ai besoin de convertir le client en personne afin de pouvoir l'enregistrer dans la base de données. Le projet n'utilise aucun mappeur automatique.
J'ai 4 solutions possibles en tête:
Méthode .ToPerson () dans la classe Consumer. C'est simple, mais cela me semble rompre le modèle de responsabilité unique, en particulier que la classe Consumer est mappée à d'autres classes (certaines requises par une autre API externe), elle devrait donc contenir plusieurs méthodes de mappage.
Constructeur de mappage dans la classe Person prenant Consumer comme argument. Aussi facile et semble aussi briser le modèle de responsabilité unique. J'aurais besoin de plusieurs constructeurs de mappage (car il y aura une classe d'une autre API, fournissant les mêmes données que Consumer mais dans un format légèrement différent)
Classe de convertisseurs avec méthodes d'extension. De cette façon, je peux écrire la méthode .ToPerson () pour la classe Consumer et lorsqu'une autre API est introduite avec sa propre classe NewConsumer, je peux simplement écrire une autre méthode d'extension et la conserver dans le même fichier. J'ai entendu dire que les méthodes d'extension sont mauvaises en général et ne devraient être utilisées qu'en cas de nécessité absolue, c'est ce qui me retient. Sinon j'aime cette solution
Classe Converter / Mapper. Je crée une classe distincte qui gérera les conversions et implémentera des méthodes qui prendront l'instance de classe source comme argument et retourneront l'instance de classe de destination.
Pour résumer, mon problème peut être réduit à un certain nombre de questions (toutes dans le contexte de ce que j'ai décrit ci-dessus):
Mettre la méthode de conversion à l'intérieur d'un objet (POCO?) (Comme la méthode .ToPerson () dans la classe Consumer) est-il considéré comme une rupture du modèle de responsabilité unique?
L'utilisation de constructeurs de conversion dans une classe (de type DTO) est-elle considérée comme une rupture du modèle de responsabilité unique? Surtout si une telle classe peut être convertie à partir de plusieurs types de sources, donc plusieurs constructeurs de conversion seraient nécessaires?
L'utilisation de méthodes d'extension tout en ayant accès au code source de la classe d'origine est-elle considérée comme une mauvaise pratique? Un tel comportement peut-il être utilisé comme modèle viable pour séparer la logique ou est-ce un anti-modèle?
Person
classe est-elle un DTO? contient-il un comportement?