Является ли ASP.NET MVC действительно MVC?Или как отделить модель от контроллера? - PullRequest
5 голосов
/ 18 июня 2010

Этот вопрос немного риторический. В какой-то момент у меня возникло ощущение, что ASP.NET MVC не является подлинной реализацией шаблона MVC. Или я этого не понял.

Рассмотрим следующую область: электрическая лампа , переключатель и датчик движения . Они соединены вместе и при входе в помещение детектор движения включает лампочку. Если я хочу представить их как MVC:

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

Коммутатор имеет одно закрытое поле (вкл / выкл) в качестве состояния и два метода (PressOn, PressOff). Если вы вызываете PressOn, когда он выключен, он переходит в состояние «Вкл.», Если вы вызываете его снова, состояние не меняется.

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

Вот так я понимаю классическую декомпозицию MVC, поправьте меня, если я ошибаюсь.

Теперь давайте разберем его в ASP.Net MVC.

  • Лампа еще вид
  • Контроллер будет переключателем + детектор движения
  • Модель - это некоторый объект, который просто передает состояние лампочке.

Таким образом, логика, которая определяет поведение, переходит к контроллеру.

Вопрос 1: Правильно ли я понимаю MVC и ASP.NET MVC?
Вопрос 2: Если да, согласны ли вы с тем, что ASP.NET MVC не является 100% точной реализацией?

И вернемся к жизни. Последний вопрос - как отделить модель от контроллера в случае ASP.NET MVC. Там может быть две крайности. Контроллер выполняет базовые функции и вызывает модель для выполнения всей логики. Другой - контроллер выполняет всю логику, а модель - это просто что-то вроде класса со свойствами, сопоставленными с БД.

Вопрос 3: Где мне провести черту между этими крайностями? Как сбалансировать?

Спасибо, Андрей

Ответы [ 3 ]

2 голосов
/ 18 июня 2010

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

Модель (Репозиторий)

Function switchOn() as bulb
    if !bulb.lightOn then
        bulb.lightOn = true
    end if
        return bulb
End Function

Function switchOff() as bulb
    if bulb.lightOn then
        bulb.lightOn = false
    end if
        return bulb
End Function

Function Motion(senseMotion as boolean) as bulb
    if(senseMotion and !bulb.lightOn) then
         bulb.lightOn = true
    end if
    return bulb
End Function

Контроллер

Function PressSwitchOn() as actionresult
     return view("Bulb", lightRepository.switchOn)
End Function

Function PressSwitchOff() as actionresult
     return view("Bulb", lightRepository.switchOff)
End Function

Function SomethingMoved(byval hasMoved as boolean) as actionresult
     return view("Bulb", lightRepository.Motion(hasMoved))
End Function

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

Чтобы ответить на вопросы.

  1. Да, я думаю, вы это прекрасно понимаете
  2. Нет, я бы не согласился. Одним из преимуществ ASP.NET MVC является то, что он чрезвычайно гибок в вашей реализации. Вы могли бы поставить всю свою логику на свое усмотрение, если бы вы действительно этого хотели (почему, о, почему бы кто-то захотел это сделать), но у вас есть возможность.
  3. Я думаю, чтобы нарисовать линии, помните о принципах СУХОЙ. Если у вас логика повторяется несколько раз, убедитесь, что она является частью модели или какого-либо пользовательского бизнес-класса, на который вы можете ссылаться из одного места. Для меня это один из основных принципов разработки приложения MVC.
1 голос
/ 18 июня 2010

В вашем примере детектор движения все еще должен вызывать SwitchOn и SwitchOff, которые в основном совпадают с контроллером, вызывающим те же методы в хранилище.Поэтому, если вы рассматриваете приложение ASP.NET MVC, реализующее шаблон хранилища, ваш аргумент будет отклонен.

Вывод:

  1. Да, в принципе вы правы, но вы очень ограниченыв том, как можно использовать инфраструктуру MVC.
  2. Нет, я не согласен с вами.
  3. Это важно?MVC - это модель, разработанная для облегчения разработки, а не усложнения.Напишите ваше заявление так, чтобы оно выглядело уместным, и назовите его «MVC inpsired», если вы думаете, что нарушаете правила (но кого, черт возьми, это будет волновать ...?).
0 голосов
/ 18 августа 2015

В платформе MVC - запрос всегда ПЕРВЫЙ поступает в контроллер;тогда только модель, созданная и отображаемая с использованием представления

В вашем случае запрос идет в Switch (которая, как вы сказали, является моделью), так что вы не можете разложить сценарий движения лампочки переключателя описанным способом.

...