只是一个问题,如果我使用asp.net mvc作为我的ddd应用程序的前端,那么如果我想在我的域实体中进行验证,我可以使用asp.net mvc验证属性吗?
因为我认为我们的域不应该绑定到任何特定的编程语言,所以使用mvc验证属性是尴尬的。
如果我使用mvc验证属性,那么它将有助于我有效地进行验证,而不是编写自定义。
请帮我选择正确的方法。
答案 0 :(得分:1)
您可以在视图模型上使用验证属性,但不能在域模型上使用验证属性。
我写了为什么在另一个答案(我知道你找到了,但其他人可能会感兴趣):https://stackoverflow.com/a/9765945/70386
大多数映射器(如Automapper)在没有公共属性的情况下工作,因此您可以验证视图模型,然后将信息复制到域模型。
该解决方案的问题在于,您的域事件(以及域模型方法中更复杂的验证逻辑)可能不会被触发。
域模型强制您在域之后设计UI(因为CRUD应用程序在域模型中不能很好地工作)。它在开始时会感觉有点尴尬,但用户体验会高得多。
答案 1 :(得分:1)
我经常采用的方法是使用System.ComponentModel.DataAnnotations
属性来验证ASP.NET MVC视图模型DTO,然后让DTO相应地更新或创建域对象。域对象在没有验证属性的情况下验证自己,使用抛出ArgumentException
实例的常规参数检查。这允许域对象始终保持一致,就像你求助于验证框架一样,在实体被持久化之前必须小心执行验证逻辑(通过直接调用或拦截ORM事件)。例如:
// this view model class lives in a Models folder in the ASP.NET MVC project
public class PersonViewModel
{
[Required]
public string Name { get; set; }
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
public Person ToPerson()
{
return new Person(this.Name, this.Email);
}
public void UpdatePerson(Person person)
{
person.Name = this.Name;
person.Email = this.Email;
}
}
// this domain class normally lives in the domain layer project
public class Person
{
public Person(string name, string email = null)
{
this.Name = name;
this.Email = email;
}
string name;
string email;
public string Name
{
get { return this.name; }
set
{
if (string.IsNullOrEmpty(value))
throw new ArgumentException();
this.name = value;
}
}
public string Email
{
get { return this.email; }
set
{
if (!string.IsNullOrEmpty(value) && !IsValidEmail(value))
throw new ArgumentException();
this.email = value;
}
}
}
此外,您可以选择在System.ComponentModel.DataAnnotations
中使用验证属性,而无需使用ASP.NET MVC。这是一个单独的组装。