2010-04-03 15 views
5

estoy luchando para engranar dos mejores prácticas juntos:ASP.NET MVC 2 dtos de validación utilizando en lugar de entidades del dominio

  1. Uso DataAnnotations + ModelBinding para la validación en ASP.NET MVC 2
  2. Uso de dtos vez de las entidades de dominio al pasar datos a través del modelo de vista

Si quiero pasar por encima de dtos en lugar de entidades de dominio, a continuación, aprovechando DataAnnotations + ModelBinding para la validación se me requiere para especificar atributos de validación en mis clases DTO. Esto da como resultado una gran cantidad de trabajo duplicado ya que varios DTO pueden contener campos superpuestos con las mismas restricciones de validación. Esto significa que cada vez que cambie una regla de validación en mi dominio, debo buscar todos los DTO que correspondan con ese valor y actualizar sus atributos de validación.

Respuesta

2

No debe tener más de un DTO por entidad, por lo que solo debe aplicar los atributos de validación una vez por DTO. Si necesita varias entidades para una Vista, incluya varias DTO como propiedades de su ViewModel.

+1

Eso parece un poco restrictivo. ¿Qué sucede si una vista necesita todas las propiedades de una entidad mientras que otra vista solo necesita algunas? ¿No utilizaría ese caso la invocación de múltiples DTO? –

+0

Estoy de acuerdo con Kevin, podría pensar en instancias en las que quisiera varios DTO para fines de visualización. Sin embargo, solo tener un DTO para enviar datos sería un enfoque sensato. – roryf

+0

DTO son bolsas para sus datos, el ViewModel es el lugar para mezclar y combinar. No creo que sea una buena idea tener múltiples DTO con datos variables, eso se mete en el lío que, con razón, no quieres tener que mantener. –

1

tal vez usted podría utilizar las anotaciones meta, lo que pone los atributos en una clase separada: muestra

namespace MvcApplication1.Models 
{ 
    [MetadataType(typeof(MovieMetaData))] 
    public partial class Movie 
    { 
    } 


    public class MovieMetaData 
    { 
     [Required] 
     public object Title { get; set; } 

     [Required] 
     [StringLength(5)] 
     public object Director { get; set; } 


     [DisplayName("Date Released")] 
     [Required] 
     public object DateReleased { get; set; } 
    } 
} 

Código fue tomado de this article.

+0

Si bien puedo ser incorrecto al decir esto, recomiendo usar Metadatos en las clases de DTO y no en el exterior. como se menciona en mis comentarios anteriores. Sin embargo, los pondría en un tipo de metadata si estuviera vinculando directamente a mi capa de Entity Framework en un proyecto simple y/o use la API fluida. – jwize

2

Puede que encuentre útil this.

Y tenga en cuenta que la validación vive en todas partes. No hay nada de malo si los DTO aplican la validación UI (como obtener los campos necesarios rellenos, fecha y hora en el formato correcto, etc.) y objetos de dominio: validación de dominio (por ejemplo, la cuenta tiene dinero antes de retirar la operación).

No puede crear la validación universal. Lo mejor que puede hacer: colóquelo en los lugares apropiados.

Y elimine esa sensación de duplicación. El uso de DTO generalmente significa aplicar el principio de responsabilidad única. No hay duplicación si tiene 2 objetos de clientes donde uno es responsable de llevar la lógica de negocios y segundo que es responsable de mostrarlos.

Cuestiones relacionadas