我正在努力将两个最佳实践融合在一起:
如果我想要传递DTO而不是域实体,那么利用DataAnnotations + ModelBinding进行验证需要我在DTO类上指定验证属性。由于多个DTO可能会使重叠字段具有相同的验证限制,因此会导致大量重复工作。这意味着每当我更改域中的验证规则时,我都必须找到与该值对应的所有DTO并更新其验证属性。
答案 0 :(得分:2)
每个实体不应该有多个DTO,因此每个DTO只需要应用一次验证属性。如果您需要View的多个实体,请将多个DTO包含为ViewModel的属性。
答案 1 :(得分:2)
您可能会发现有用的this。
请记住,验证无处不在。如果DTO应用UI验证(例如填写必要的字段,正确格式的日期时间等)和域对象 - 域验证(例如帐户在撤销操作之前有钱),则没有任何错误。
您无法创建通用验证。你可以做的最好的事情 - 把它放在适当的地方。
并且感觉到关于重复的感觉。 DTO的使用通常意味着应用单一责任原则。如果您有2个客户对象,其中一个负责承载业务逻辑,第二个负责显示它,则没有重复。
答案 2 :(得分:1)
也许你可以使用元注释,它将属性放在一个单独的类中:
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; }
}
}
代码示例来自this article。