Asignación de atributos de validación de la entidad de dominio a DTO

Tengo una entidad de capa de dominio estándar:

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

    public string Name { get; set; }

    public decimal Price { get; set;}
}

que tiene algún tipo de atributos de validación aplicados:

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

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

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

Como puedes ver, he hecho estos atributos completamente. El marco de validación (NHibernate Validator, DataAnnotations, ValidationApplicationBlock, Castle Validator, etc.) en uso aquí no es importante.

En mi capa de cliente, también tengo una configuración estándar en la que no uso las entidades de dominio, sino que las asigno a ViewModels (también conocido como DTO), que usa mi capa de vista:

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

    public string Name { get; set; }

    public decimal Price { get; set;}
}

Entonces digamos que quiero que mi cliente / vista pueda realizar algunas validaciones básicas a nivel de propiedad.

La única manera que veo que puedo hacer esto es repetir las definiciones de validación en el objeto 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;}
}

Esto claramente no es satisfactorio, ya que ahora he repetido la lógica de negocios (validación a nivel de propiedad) en la capa ViewModel (DTO).

Entonces, ¿qué puede hacerse?

Suponiendo que utilizo una herramienta de automatización como AutoMapper para asignar mis entidades de dominio a los DTO de ViewModel, ¿no sería bueno transferir también la lógica de validación de las propiedades asignadas a ViewModel también?

Las preguntas son:

1) ¿Es esta una buena idea?

2) Si es así, ¿se puede hacer? Si no, ¿cuáles son las alternativas, si las hay?

Gracias de antemano por cualquier entrada!

Respuestas a la pregunta(7)

Su respuesta a la pregunta