2014-10-02 3 views
0

Мой вопрос: как добавить пользовательский запрос к модели в asp.net mvc, все учебники, которые я видел, они делают запрос в контроллере.Добавить запрос к модели в asp.net mvc

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

Я пытаюсь это сделать, но у меня нет DbContext, доступных в модели, поэтому как мне это сделать?

+0

Не добавляйте к вам модели. Либо сделайте запрос в контроллере, либо попросите контроллер вызвать службу, которая возвращает результаты запроса –

+0

Я не добавляю запрос к моей модели ?, все учебные пособия говорят, что контроллер не должен знать о какой-либо базе данных, это дата работа слоя доступа, то, как вы говорите мне, так я вижу во всех учебниках, но почему они так делают? –

+0

Какие учебники вы имеете в виду? Учебники MS [Learn About ASP.NET MVC] (http://www.asp.net/mvc) имеют все свои контексты db в методах контроллера (хотя я предпочитаю использовать репозиторий с DI, как указано Mehrdad ниже). –

ответ

1

Существует несколько способов достижения этого, и у каждого есть свои плюсы и минусы. Вот несколько appraoches:

1) Domain Model Pattern
Автор шаблона модели домена, Мартин Фаулер, обеспечивает это определение (Fowler, 2003):

Объектная модель домена, который включает в себя как поведения и данных.

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

2) Repository Pattern

Используйте репозиторий, чтобы отделить логику, которая извлекает данные и отображает его в модели объекта из бизнес-логики, которая действует на модели. Бизнес-логика должна быть агностикой для типа данных, который содержит слой источника данных. Например, уровнем источника данных может быть база данных, список SharePoint или веб-служба.

Как отметил @Mehrdad, использование этого шаблона освобождает проблемы контроллера БД, и вся ваша логика БД остается в одном месте.

3) Command Query Separation pattern (мой любимый)

Он утверждает, что каждый метод должен быть либо команда, которая выполняет действие, или запрос, который возвращает данные в вызывающую, но не оба. Другими словами, задавая вопрос, не следует изменять ответ. Более формально методы должны возвращать значение только в том случае, если они являются ссылочно прозрачными и, следовательно, не имеют побочных эффектов.

Примечание: это ОКК и НЕ CQRS модель

Разница между CQS и Repository шаблона является то, что с Entity Framework, DbContext уже заворачивает хранилище шаблон для вас (DbContext единичная работы и DbSets являются репозиториями). Поэтому создание другого слоя репозитория является избыточным. То, что CQS дает вам, - это тщательный контроль над вашими запросами/командами и позволяет расширять их с помощью декораторов, которые могут обрабатывать дополнительную логику, не загрязняя основную бизнес-логику.Вот некоторые большие ссылки о CQS:

Это answer является отличным примером того, как репозиторий шаблон может получить использоваться с CQS вместе.

Все это может быть весьма подавляющим, поэтому я предлагаю вам не спешить, реализовать проекты Proof-OF-Concept, используя эти шаблоны и решить, какой из них лучше подходит для вашей общей архитектуры.

0

Обычно можно использовать Repository шаблон для этого, например, если у вас есть объект пользователя:

public class UserRepository:IUserRepository{ 
    public List<User> GetUsers() 
    { 
    //Your code and query here 
    } 
    public void AddUser(User user) 
    { 
    //Your code and query here 
    } 
} 

Затем вы проходите этот класс в UserController и называть его функции. Как вы можете видеть, я также добавил IUserRepository, чтобы вы могли его использовать, если вы делаете Dependency Injection

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