域验证问题

时间:2012-03-27 08:34:54

标签: asp.net-mvc domain-driven-design

只是一个问题,如果我使用asp.net mvc作为我的ddd应用程序的前端,那么如果我想在我的域实体中进行验证,我可以使用asp.net mvc验证属性吗?

因为我认为我们的域不应该绑定到任何特定的编程语言,所以使用mvc验证属性是尴尬的。

如果我使用mvc验证属性,那么它将有助于我有效地进行验证,而不是编写自定义。

请帮我选择正确的方法。

2 个答案:

答案 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。这是一个单独的组装。