Reutilización de un DTO de nivel superior como un niño en otro DTO

7

¿Cuál es la recomendación sobre la reutilización de DTO como un niño en otro DTO?

Estoy usando la API web de ASP.NET (C #) y estoy consumiendo los resultados con Angular 1.x (no estoy seguro de si eso realmente importa).

Tengo los siguientes DTO

class SiteDto {
 public int SiteId {get;set;}
 public string Name {get; set;}
 public DateTime CreatedDate {get;set;}
  ...
}

class SiteEventDto {
 // pk
 public int SiteEventId {get; set; }
 // fk
 public int SiteId {get; set;}
 public DateTime EventStartDate {get; set;}
 public DateTime EventEndDate {get; set;}
 ...
}

Quiero devolver una lista de eventos del sitio con un nombre de sitio (por ejemplo). ¿Hay alguna recomendación para el enlace entre SiteEvent y Site para obtener esta información de los padres? Por ejemplo, veo las siguientes posibilidades:

  1. Reutilizar DTO existente: usar el DTO del sitio existente como una propiedad dentro del DTO de SiteEvent (por ejemplo, public SiteDto ParentSite { get; set; } )

    • Pros:
      • Reutilización del código
      • escalable
    • Contras:
      • Potencialmente una gran cantidad de información adicional (especialmente para llamadas basadas en web / basadas en json) debido a propiedades innecesarias y posiblemente a jerarquías de padres adicionales
  2. Crear nuevo DTO principal: Cree un DTO secundario específico para esta tarea (por ejemplo, class SiteEventSiteDto { ...) y haga referencia a eso a través de una propiedad secundaria en SiteEventDto

    • Pros:
      • Reducir la hinchazón adicional de los campos no utilizados
    • Contras:
      • Reutilización de código mínimo
  3. Acoplar estructura de clases: Aplanar la estructura de clases para incluir simplemente una propiedad "SiteName" en el SiteEventDto (por ejemplo, public string SiteName { get; set; } )

    • Pros:
      • Reducir la hinchazón adicional (incluso más)
    • Contras:
      • Reutilización de código mínimo

Probablemente tenga sentido analizar cada caso individualmente y evaluar las siguientes preguntas:

  • ¿Preveo la necesidad de propiedades adicionales fuera del objeto principal?
  • ¿Qué tan difícil es agregar una nueva propiedad en una estructura plana?
  • ¿Cuánto ancho de banda va a costar realmente al usuario la hinchazón?

Supongo que mis preguntas para la comunidad son:

  • ¿Es una práctica común reutilizar un DTO para más de un controlador (escenario # 1, arriba) o se considera una mala práctica por algún motivo? O, ¿tiene más sentido crear un nuevo DTO secundario o utilizar una estructura plana cuando sea posible?
  • Y, por último, ¿mis divagaciones anteriores parecen ser un buen enfoque para este problema?
pregunta Adam Plocher 01.10.2016 - 08:22

1 respuesta

6

Reutiliza el DTO existente, crea un nuevo DTO principal y estructura de clase Aplanar

La elección entre el código reutilizable ( a veces nos hace sentir como cuadrar el círculo ) o la personalización ( a veces nos hace sentir como tener un deja vu ) es una cuestión de necesidades y preferencias.

Ya expusiste pros y cons de cada solución. Ahora, tienes que equilibrarlos:

  • Esos profesionales que se adaptan mejor a sus necesidades .

  • Esos contras que no le impiden cumplir con los requisitos .

Evalúa y responde las siguientes preguntas:

  

¿Preveo la necesidad de propiedades adicionales del objeto principal?

Al proporcionar propiedades adicionales ( que pueden parecer innecesarias a primera vista ), es posible que esté guardando llamadas al servidor. Reducir la concurrencia y guardar los recursos del dispositivo siempre es bienvenido en cualquier sistema.

  

¿Qué tan difícil es agregar una nueva propiedad en una estructura plana?

Depende de lo difícil que sea recuperar la propiedad:

  • ¿Necesitamos ejecutar consultas adicionales? ¿Cuántos? ¿Qué tipo de consultas?
  • ¿Debemos hacer que la consulta real sea más compleja? ¿Qué tipo de complejidad estamos introduciendo?
  • ¿Tenemos que llamar a servicios externos? ....
  

¿Cuánto ancho de banda va a costar realmente la hinchazón al usuario?

  • ¿Con qué frecuencia van a pedir los usuarios el DTO complejo? (Si se solicita solo una vez durante la "sesión". ¿Hay algún costo?)

  • ¿Es un requisito para hacer recursos de luz?

  • ¿Es importante usar el menor ancho de banda posible?

  • ¿Existe algún tipo de limitación de consumo de ancho de banda?

Ok ... Demasiadas preguntas

Todas estas preguntas pueden llevar a una optimización prematura. Empieza por el más sencillo. Aplique el principio KISS .

Finalmente ...

  

Y por último, mis divagaciones anteriores parecen ser un buen enfoque para esto   problema?

Es necesario conocer el proyecto y los requisitos para poder decir qué solución es recomendable / buena / mejor

Hasta ahora, los 3 son legítimos y "buenos" si resuelven el problema.

    
respondido por el Laiv 01.10.2016 - 10:14

Lea otras preguntas en las etiquetas