2011-05-02 4 views
1

Здесь есть некоторые похожие вопросы, но никто из них не ответил.Вызов публичной функции в другом контроллере?

Как мне это сделать, лучший способ?

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

Должен ли я выполнить функцию (например, UserController.GetAllUsers())?

+0

Если это совместная функция, зачем вы помещаете ее в контроллер, а не на свой сервисный уровень (или любой другой слой, на котором находится ваш веб-интерфейс поверх). – R0MANARMY

+0

Ну, это не общая функция. И поскольку он сильно связан с userController, я бы хотел его сохранить. На данный момент я создаю новый экземпляр класса Usercontroller и вызываю его, хотя этот экземпляр. – Anders

+2

Это * - общая функция - тот факт, что вам нужна одна и та же функциональность в 2 контроллерах, доказывает это. И, пожалуйста, не используйте контроллеры, как вы, это просто неправильно. – rsenna

ответ

3

Я бы не предложил сделать способ доступным на другом контроллере. В ASP.NET MVC контроллеры могут быть созданы различными способами (инъекции, фабрики и т. Д.), И вы не можете гарантировать, что вы будете эмулировать любой используемый механизм.

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

Класс не должен знать ASP.NET MVC; вы должны передать их из самих экземпляров контроллера.

+0

Хорошо, спасибо! Я буду перемещать все мои функции, которые не приводят к представлению из моих контроллеров в helperClasses. Это было бы хорошо, не так ли? Я довольно новичок в MVC, и я просто учил себя ... поэтому я, возможно, пропустил некоторые из этих основополагающих принципов. – Anders

+1

@ Аnders: Это очень правильно. Более чем вероятно, что контроллер переведет любую строку запроса или значения формы в типы .NET, которые вы затем передадите в свои вспомогательные методы. Причина, по которой вы не хотите сами создавать контроллер, заключается в том, что в ASP.NET MVC контроллер обычно настраивается с помощью «ControllerContext», и просто создание нового контроллера не настроит эту информацию правильно. При создании вспомогательных классов вы удаляете необходимость в 'ControllerContext', контроллер действует как адаптер между' ControllerContext' и вашей логикой. – casperOne

+0

Спасибо casperOne! Очень хорошо объяснено :) – Anders

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