Mapowanie atrybutów walidacji z elementu domeny do DTO

Mam standardową jednostkę warstwy domeny:

public class Product
{
    public int Id { get; set; }

    public string Name { get; set; }

    public decimal Price { get; set;}
}

który ma jakieś atrybuty walidacji:

public class Product
{
    public int Id { get; set; }

    [NotEmpty, NotShorterThan10Characters, NotLongerThan100Characters]
    public string Name { get; set; }

    [NotLessThan0]
    public decimal Price { get; set;}
}

Jak widać, wymyśliłem te atrybuty całkowicie. Która struktura walidacji (NHibernate Validator, DataAnnotations, ValidationApplicationBlock, Castle Validator itp.) Jest tutaj używana, nie jest ważna.

W mojej warstwie klienta mam również standardową konfigurację, w której nie używam samych jednostek Domeny, ale zamiast tego odwzorowuję je na ViewModels (aka DTO), którego używa moja warstwa widoku:

public class ProductViewModel
{
    public int Id { get; set; }

    public string Name { get; set; }

    public decimal Price { get; set;}
}

Powiedzmy, że chcę, aby mój klient / widok mógł wykonać kilka podstawowych walidacji na poziomie właściwości.

Jedynym sposobem, w jaki mogę to zrobić, jest powtórzenie definicji walidacji w obiekcie 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;}
}

Jest to oczywiście niezadowalające, ponieważ powtórzyłem logikę biznesową (walidacja na poziomie właściwości) w warstwie ViewModel (DTO).

Więc co można zrobić?

Zakładając, że używam narzędzia do automatyzacji, takiego jak AutoMapper, aby odwzorować moje jednostki domeny na moje DTO ViewModel, czy nie byłoby też fajnie przenieść logikę walidacji mapowanych właściwości również do ViewModel?

Pytania są następujące:

1) Czy to dobry pomysł?

2) Jeśli tak, czy można to zrobić? Jeśli nie, jakie są alternatywy?

Z góry dziękuję za wszelkie dane wejściowe!

questionAnswers(7)

yourAnswerToTheQuestion