2009-02-06 2 views
2

Я пытаюсь обернуть голову вокруг проверки в сценарии MVC. У меня есть настройка моего приложения, так что у него есть уровень Data/Repository, который использует Linq2SQL и создает объекты в моей модели домена. Однако я не раскрываю свои объекты Linq2SQL для остальной части моего приложения, но теперь модель моего домена в основном похожа на мои таблицы базы данных. Я хотел сделать это в случае, если я захочу позже лишить Linq2SQL.Проверка части модели в MVC

Затем у меня есть сервисный уровень, который вызывается из моих контроллеров для выполнения действий и захвата моей модели домена из моего уровня данных.

Я хочу использовать рамки проверки, такие как xVal. Кажется общей мудростью, что ваша модель должна содержать ваши правила проверки. Мой вопрос в том, как вы проверяете часть модели (или различные состояния)? Например, у меня есть объект User, у которого есть имя пользователя, пароль и другие свойства. У меня есть действие «Вход», где я хочу убедиться, что указаны имя пользователя и пароль. Однако, когда я создаю нового пользователя, я бы хотел, чтобы требовалось больше полей. Кажется странным создание объекта Login в моей модели, когда у меня уже есть объект User.

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

ответ

2

Вы правы, что валидация обычно выполняется на уровне модели. Проблема, вероятно, в вашей модели домена --- у вас есть идея пользователя, который недействителен до тех пор, пока в нем не будет всего этого.

Подумайте вместо пользователя, который может быть анонимным или может быть заполнен. Легкий способ подумать, что пользователь должен иметь экземпляр объекта Credentials; это также хорошее место для отслеживания разрешений и т. д.

+0

Это интересный способ взглянуть на него. В принципе, это покажет мне, где мне нужно вытащить части моей физической модели в более логичную модель. Это упростит проверку части. Я посмотрю, как это происходит. Благодаря! – Jonathan

+0

да. Дело в том, чтобы подумать о модели DOMAIN. Здесь у вас в ваших «рассказах» случай, когда ваша сессия может быть анонимной; объектная модель должна представлять это. Другая версия будет иметь сеанс, который имеет - Пользователь, который может быть анонимным. –

0

Извините, но я не могу думать о вашем примере. Пользовательский объект не должен иметь метод входа. У меня есть следующие

public class User 
{ 
    public bool ConfirmPassword(string password) 
    { 
    ... 
    } 
} 

Тогда репозиторий. Это находит пользователя по имени пользователя, а затем проверяет ConfirmPassword, чтобы убедиться, что оно верное, если оно не возвращает null.

public interface IUserRepository 
{ 
    ..other stuff.. 
    User GetByUserNameAndPassword(string userName, string password); 
} 

Что касается проверки, у меня обычно есть два способа получения ограничений.

//The constraint itself 
public interface IConstraint 
{ 
    string Name { get; } 
    bool IsValid(); 
} 

//A way to get constraints that are inexpensive to evaluate, such 
//as Name != null etc. This can be implemented as a service to provide 
//custom constraints from an external source (such as rows in a DB) 
//which then additionally checks "instance" if it implements the 
//interface and adds its constraints to the result too. 

//These are the kinds of constraints I evaluated in the GUI every 
//time the object changes, so I can show a list of errors. 
public interface IConstraintProvider 
{ 
    IEnumerable<IConstraint> GetConstraints(object instance); 
} 

//Finally a way to get constraints that are expensive to evaluate, this 
//includes checking invariants that might involve DB access. These constraints 
//(along with the cheap evaluation constraints) are all evaluated before 
//my persistence service attempts to write the object's changes to the DB 
public interface IPreSaveConstraintProvider 
{ 
    IEnumerable<IConstraint> GetConstraints(object instance); 
} 
+0

У меня нет метода входа в свой объект User. У меня есть метод входа в мой сервисный уровень. My Repository возвращает IQueryable, который использует сервисный уровень (я знаю, что есть некоторые споры об этом) – Jonathan

Смежные вопросы