Quiero hacer algunas preguntas sobre las mejores prácticas con respecto a los tipos de mapeo y el uso de métodos de extensión en C #. Sé que este tema se ha discutido varias veces en los últimos años, pero he leído muchas publicaciones y todavía tengo dudas.
El problema que encontré fue extender la clase que poseo con la funcionalidad "convertir". Digamos que tengo la clase "Persona" que representa un objeto que será utilizado por alguna lógica. También tengo una clase "Cliente" que representa una respuesta de una API externa (en realidad habrá más de una API, por lo que necesito asignar la respuesta de cada API a un tipo común: Persona). Tengo acceso al código fuente de ambas clases y, en teoría, puedo implementar mis propios métodos allí. Necesito convertir Cliente a Persona para poder guardarlo en la base de datos. El proyecto no utiliza ningún mapeador automático.
Tengo 4 posibles soluciones en mente:
Método .ToPerson () en la clase Consumer. Es simple, pero parece romper el patrón de responsabilidad única para mí, especialmente porque la clase Consumer está asignada a otras clases (algunas requeridas por otra API externa) también, por lo que necesitaría contener múltiples métodos de mapeo.
El constructor de mapeo en la clase Person toma Consumer como argumento También es fácil y también parece romper el patrón de responsabilidad única. Necesitaría tener múltiples constructores de mapeo (ya que habrá clases de otra API, proporcionando los mismos datos que Consumer pero en un formato ligeramente diferente)
Clase de convertidores con métodos de extensión. De esta manera puedo escribir el método .ToPerson () para la clase Consumer y cuando se introduce otra API con su propia clase NewConsumer, puedo escribir otro método de extensión y mantenerlo todo en el mismo archivo. He escuchado una opinión de que los métodos de extensión son malos en general y deben usarse solo si es absolutamente necesario, así que eso es lo que me está frenando. De lo contrario, me gusta esta solución
Clase Convertidor / Mapeador. Creo una clase separada que manejará las conversiones e implementará métodos que tomarán la instancia de la clase de origen como argumento y devolverán la instancia de la clase de destino.
En resumen, mi problema puede reducirse a varias preguntas (todo en contexto a lo que describí anteriormente):
¿Se considera que romper el método de conversión dentro del objeto (POCO?) (Como el método .ToPerson () en la clase Consumer) rompe el patrón de responsabilidad única?
¿El uso de constructores de conversión en clase (tipo DTO) se considera romper el patrón de responsabilidad única? ¿Especialmente si tal clase se puede convertir de múltiples tipos de fuente, entonces se requerirían múltiples constructores de conversión?
¿Usar métodos de extensión mientras se tiene acceso al código fuente original de la clase se considera una mala práctica? ¿Se puede usar este comportamiento como patrón viable para separar la lógica o es un antipatrón?
Person
clase un DTO? ¿contiene algún comportamiento?