проблемы с проверкой домена - PullRequest
0 голосов
/ 27 марта 2012

Просто вопрос, если я использую asp.net mvc в качестве внешнего интерфейса для моего приложения DDD, то если я хочу проверки в доменных сущностях, могу ли я использовать для этого атрибут проверки asp.net mvc?

Поскольку я думал, что наш домен не должен быть привязан к какому-либо конкретному языку программирования, использование атрибута проверки mvc неудобно.

Если я использую атрибут проверки mvc, это поможет мне сделать проверку эффективнее, чем написание пользовательских.

Пожалуйста, помогите мне выбрать правильный подход к нему.

Ответы [ 2 ]

1 голос
/ 28 марта 2012

Подход, который я часто использую, заключается в использовании атрибутов System.ComponentModel.DataAnnotations для проверки DTO модели представления ASP.NET MVC и последующего соответствующего обновления 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.Это отдельная сборка.

1 голос
/ 27 марта 2012

Вы можете использовать атрибуты проверки в ваших моделях представления, но не в моделях вашего домена.

Я написал почему в другом ответе (который, я знаю, вы нашли, но другие могут быть заинтересованы): https://stackoverflow.com/a/9765945/70386

Большинство картографов (например, Automapper) работают без открытых свойств, поэтому вы можете проверить модель представления, а затем скопировать информацию в модель домена.

Проблема этого решения заключается в том, что события вашего домена (и более сложная логика проверки в методах модели вашего домена), вероятно, не будут инициированы.

Модели домена вынуждают вас создавать свой пользовательский интерфейс последомен (поскольку приложения CRUD не очень хорошо работают с моделями доменов).В начале это может показаться немного неловким, но пользовательский опыт будет намного выше.

...