gpt4 book ai didi

asp.net-mvc - 将验证属性从域实体映射到DTO

转载 作者:行者123 更新时间:2023-12-03 08:49:27 26 4
gpt4 key购买 nike

我有一个标准的域层实体:

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

public string Name { get; set; }

public decimal Price { get; set;}
}

其中应用了某种验证属性:
public class Product
{
public int Id { get; set; }

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

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

如您所见,我已经完全组成了这些属性。这里使用哪个验证框架(NHibernate Validator,DataAnnotations,ValidationApplicationBlock,CaSTLe Validator等)并不重要。

在我的客户端层中,我还有一个标准设置,其中我不使用Domain实体本身,而是将它们映射到我的 View 层使用的ViewModels(又名DTO):
public class ProductViewModel
{
public int Id { get; set; }

public string Name { get; set; }

public decimal Price { get; set;}
}

然后,让我们说我希望我的客户/ View 能够执行一些基本的属性级验证。

我看到的唯一的方法是在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;}
}

这显然是不令人满意的,因为我现在在ViewModel(DTO)层中重复了业务逻辑(属性级验证)。

那该怎么办呢?

假设我使用了诸如AutoMapper之类的自动化工具来将我的Domain实体映射到ViewModel DTO,那么以某种方式将映射属性的验证逻辑也转移到ViewModel上也很酷吗?

问题是:

1)这是个好主意吗?

2)如果可以,可以吗?如果没有,有什么替代方案(如果有)?

预先感谢您的任何投入!

最佳答案

如果使用支持DataAnnotations的工具,则应该能够使用元数据类包含验证属性:

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

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

并将其添加到域实体和DTO的MetadataTypeAttribute中:
[MetadataType(typeof(ProductMetadata))]
public class Product


[MetadataType(typeof(ProductMetadata))]
public class ProductViewModel

这并不是所有验证器都可以立即使用的-您可能需要扩展选择的验证框架以实现类似的方法。

关于asp.net-mvc - 将验证属性从域实体映射到DTO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2075288/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com