Куда поместить функции, которые помогают мне выполнять задачи контроллера?

В настоящее время я работаю над проектом веб-сайта ASP.net MVC.

Я поместил в свою модель все, что связано с базой данных, например, запросы и функции обновления/удаления/сохранения.

Я также создал пару контроллеров, которые выполняют логику. Я добавил пространство имен Helpers, и внутри этого пространства имен есть несколько классов, которые содержат логику для нумерации страниц, интернационализации и т. д.

Мне было интересно, как лучше всего размещать функции и классы, которые делают некоторые общие вещи, такие как создание счета?


person jao    schedule 29.09.2009    source источник
comment
Если бы я мог, я бы дал этому вопросу +100 голосов. Я действительно хочу знать, как другие люди решают эту проблему. Я только начал экспериментировать с ASP.NET MVC (в проекте среднего размера), и меня часто загоняют в угол структура каталогов и некоторые концепции MVC.   -  person Jan Zich    schedule 30.09.2009


Ответы (6)


Как я выразился в комментарии выше, меня слишком сильно интересует этот вопрос.

Во-первых, кажется неправильным создавать дополнительные каталоги (для других классов и утилит) непосредственно в вашем проекте ASP.NET MVC. Кроме того, я не чувствую, что это должно быть в модели. Для меня модель — это более или менее классы данных, которые каким-то образом представляют базу данных (или данные, которые мы пытаемся смоделировать). Кроме того, часто бизнес-функции (или «настоящие» фрагменты кода в вашем приложении) имеют дело с несколькими классами моделей одновременно, поэтому для них может не быть естественного места в каком-то классе моделей.

Поэтому я склоняюсь к следующей схеме:

  • Сделайте действия контроллера очень маленькими; всего несколько строк кода каждый.
  • Держите модель простой и по большей части нефункциональной и поместите ее в отдельный проект.
  • Поместите весь ваш код, который выполняет всю «настоящую» работу («бизнес-уровень») в отдельный проект.

Таким образом, вы получите полную свободу в выборе собственных пространств имен, сможете создавать любое количество служебных классов, функций и вообще сможете структурировать свой код по своему усмотрению, не ограничиваясь ASP.NET MVC.

Это просто идея. На данный момент я работаю над своим первым большим приложением ASP.NET MVC. Так что я на самом деле собираюсь узнать, работает ли это на практике и как.

person Jan Zich    schedule 30.09.2009

У меня есть классы моделей, в которых есть Crud и Poco, как у вас.

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

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

Например, у меня есть некоторая логика, которая довольно близка к пользовательскому интерфейсу, когда я добавляю продукт в корзину. Теперь у меня есть метод в ViewModel: AddToCart(IProductService productService, ICartService cartService).

person Mathias F    schedule 29.09.2009

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

Это почти слишком широкий вопрос.

person dove    schedule 29.09.2009
comment
Что именно ты имеешь ввиду? У вас есть ссылки на примеры? - person jao; 29.09.2009
comment
@jao ты используешь внедрение зависимостей? там много примеров. посмотрите на архитектуру s#arp для одного - person dove; 29.09.2009
comment
Так, например, у меня есть объект под названием Reservation. Является ли обычной практикой добавление к нему GenerateInvoice? Чтобы я мог вызвать Reservation.GenerateInvoice()? Или я совсем заблудился здесь? - person jao; 29.09.2009

Такая бизнес-логика должна быть где-то в вашей модели.

Тем не менее, я считаю, что когда есть что-то, что никуда не «подходит» — и у вас может возникнуть соблазн создать класс Utilities — обычно это хорошее место для использования методов расширения.

Возможно, вы можете добавить методы расширения в свой набор данных, чтобы помочь вам с нумерацией страниц?

person nikmd23    schedule 29.09.2009


Я думаю, что лучшим решением этого вопроса о практике будет следующее: поместите логику в модель, если она будет использоваться между контроллерами. Если это зависит от контроллера, просто поместите его в свой контроллер. Когда я говорю «модель», это может быть отдельный проект, который содержит вашу модель данных объекта, или это может быть модель представления, или это может быть просто папка «Модели» вашего проекта MVC.

person Ashley Raiteri    schedule 09.08.2011