Проверка на мои доменные объекты или в модели представления? Куда это должно идти? - PullRequest
1 голос
/ 25 января 2011

Я пытаюсь освободить свой сервисный уровень от зависимостей asp.net mvc, но столкнулся с проблемой. Я хочу использовать Compare, но это часть библиотеки asp.net mvc. Так что мне делать?

У меня есть класс домена (который позже используется с беглым nhibernate)

public class User()
{
   [Required(ErrorMessage = "Required")]
   [Compare()] // can't do this because not my User domain needs to know about mvc and I   rather it not
   public virtual string Email (get; set;}
   public virtual string ConfirmEmail (get; set;} // not mapped with fluent nhibernate
}

public class UserViewModel()
{
   public User User {get; set;}
}


public ActionMethod method()
{
  if(!this.ModelState.isValid)
  {

   }
}

У меня есть этот объект домена, поэтому я считаю, что было бы бессмысленно перемещать все эти свойства в UsersViewAModel, чтобы просто поставить на них проверку, а затем - через все те обратно в модель домена, которая будет использоваться для фиксации (nhibernate). фиксации)

Ответы [ 3 ]

4 голосов
/ 26 января 2011

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

// Note the partial keyword below:  the full definition of MyModel 
// can be put in a file in the model
[MetadataType(typeof(MyModelMetadata))]
public partial class MyModel {}

public class MyModelMetadata
{
    //properties with validation attributes (dataannotations)  go here...
}

Атрибуты проверки - это один элемент, который не разделен между задачами MVC: Они относятся как к проверке клиента в представлениях, так и к проверке сервера в домене, в точке, где данные хранятся в базе данных и, следовательно, нуждаются в проверке.

Таким образом, @jfar, говоря, что они должны войти в ViewModel, так же неправ, как и человек, который говорит, что они должны быть в домене.

На самом деле, ИМХО, совершенно неправильно помещать атрибуты проверки в ViewModel. ViewModel должен быть контейнером для данных, отправляемых в View. Он не должен портировать какую-либо собственную логику. Эта логика, в данном случае атрибуты валидации, должна быть определена вне ViewModel, и для этого лучше всего подойдет класс buddy, особенно если вы используете автоматический ORM, но не только в этом особом случае.

Этот вопрос является иллюстрацией того факта, что не все проблемы точно соотносятся с MVC, поэтому получить все сталинские сведения о том, куда должны идти атрибуты проверки, просто неправильно.

Мой совет: поместите их в одно место, отдельно от всех других проблем. Для этого нужно использовать классы друзей.

4 голосов
/ 25 января 2011

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

Поместите атрибуты проверки в ViewModels.

2 голосов
/ 26 января 2011
public class User()
    {
       public virtual string Email (get; set;}
       public virtual string ConfirmEmail (get; set;} // not mapped with fluent nhibernate
    }
public class UserModel()
{
   [Required(ErrorMessage = "Required")]
   [Compare()] // can't do this because not my User domain needs to know about mvc and I   rather it not
   public virtual string Email (get; set;}
   public virtual string ConfirmEmail (get; set;} // not mapped with fluent nhibernate
}

public class UserViewModel()
{
   public UserModel User {get; set;}
}


public ActionMethod method()
{
  if(!this.ModelState.isValid)
  {

   }
}

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

...