ho un'entità di livello di dominio standard:Mapping convalida gli attributi da Domain Entity a DTO
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set;}
}
che ha un qualche tipo di attributi di validazione applicati:
public class Product
{
public int Id { get; set; }
[NotEmpty, NotShorterThan10Characters, NotLongerThan100Characters]
public string Name { get; set; }
[NotLessThan0]
public decimal Price { get; set;}
}
Come potete vedere, ho fatto su questi attributi completamente. Quale framework di convalida (NHibernate Validator, DataAnnotations, ValidationApplicationBlock, Castle Validator, ecc.) In uso qui non è importante.
Nel mio livello di cliente, ho anche una configurazione standard in cui io non uso le entità di dominio stessi, ma invece li map per ViewModels (aka DTO) che mio punto di vista strato usa:
public class ProductViewModel
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set;}
}
Diamo quindi dico che voglio che il mio client/vista sia in grado di eseguire alcune convalide di livello base.
L'unico modo che vedo posso fare questo è quello di ripetere le definizioni di convalida nell'oggetto ViewModel:
public class ProductViewModel
{
public int Id { get; set; }
// validation attributes copied from Domain entity
[NotEmpty, NotShorterThan10Characters, NotLongerThan100Characters]
public string Name { get; set; }
// validation attributes copied from Domain entity
[NotLessThan0]
public decimal Price { get; set;}
}
Questo chiaramente non è soddisfacente, la logica di business come ora ho ripetuto (convalida proprietà a livello) nel livello ViewModel (DTO).
Quindi cosa si può fare?
Supponendo che io utilizzi uno strumento di automazione come AutoMapper per mappare le entità di dominio ai miei DTO ViewModel, non sarebbe bello anche trasferire in qualche modo la logica di convalida per le proprietà mappate al ViewModel?
Le domande sono:
1) Si tratta di una buona idea?
2) Se sì, può essere fatto? In caso contrario, quali sono le alternative, se presenti?
Grazie in anticipo per qualsiasi input!
EDIT: Suppongo che dovrei menzionare che sto lavorando con ASP.NET MVC. Inizialmente pensavo che questo potesse non essere rilevante, ma poi ho capito che probabilmente ci sono altri tipi di soluzioni nel mondo WinForms/WPF/Silverlight (come MVVM) che potrebbero non essere applicabili allo stack web. –
Perché hai bisogno di un DTO? Perché non limitarti alla tua classe di entità? –
@Josh - Al fine di stabilire un livello pulito di separazione, tra le altre ragioni. In ogni caso, penso che discutere il modello DTO sia un argomento a parte. –