Asp.net mvc помещает контроллеры в отдельный проект
Я просто изучаю asp.net mvc, и я пытаюсь понять, как переместить мои контроллеры в отдельный проект. Обычно, когда я разрабатывал веб-приложения asp.net раньше, я создал один проект для своих моделей, другой для своей логики, а затем был веб-сайт.
Теперь, когда я изучаю asp.net mvc, я надеялся следовать аналогичной схеме и поместить модели и контроллеры в свои собственные отдельные проекты и просто оставить view/scripts/css в Интернете. Часть моделей была простой, но я не понимаю, как сделать мои контроллеры в отдельном проекте "найденными". Кроме того, я хотел бы знать, если это целесообразно. Спасибо!
Ответы
Ответ 1
Прежде всего, неплохо было бы поместить вашу модель в отдельный проект. Как вы обнаружили, это тривиально.
Что касается контроллеров и представлений, я не вижу очевидного преимущества для их разделения для большинства базовых проектов, хотя вам может быть необходимо сделать это в конкретном приложении.
Если вы решите это сделать, вам нужно будет сообщить инфраструктуре, как найти контроллеры. Основной способ сделать это - предоставить свой собственный ControllerFactory. Вы можете взглянуть на исходный код DefaultControllerFactory, чтобы получить представление о том, как это делается. Подтипирование этого класса и переопределение метода GetControllerType (string controllerName) может быть достаточно, чтобы выполнить то, что вы просите.
Как только вы создали свой собственный контроллер ControllerFactory, вы добавите следующую строку в Application_Start в global.asax, чтобы сообщить инфраструктуре, где ее можно найти:
ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());
Обновление: Прочитайте этот пост и сообщения, на которые он ссылается для получения дополнительной информации. См. Также комментарий Фила Хаака о том, что сообщение:
ControllerBuilder.Current.DefaultNamespaces.Add(
"ExternalAssembly.Controllers");
... который не является полным решением, но, возможно, достаточно хорошим для простых случаев.
Ответ 2
Хотя разумно создать собственный ControllerFactory, мне было удобнее определять все мои контроллеры в каждом проекте, но вывести их из контроллеров в моем проекте Shared:
namespace MyProject1.Controllers
{
public class MyController : MySharedProject.Controllers.MyController
{
// nothing much to do here...
}
}
namespace MySharedProject.Controllers
{
public abstract class MyController : System.Web.Mvc.Controller
{
// all (or most) of my controller logic here...
}
}
Это имеет дополнительное преимущество, когда у вас есть место, чтобы логика вашего контроллера отличалась от проекта к проекту. Кроме того, другим разработчикам проще быстро найти логику контроллера, поскольку контроллеры существуют в стандартном месте.
Относительно того, насколько это целесообразно, я думаю, что это абсолютно так. Я создал некоторую общую логику управления учетными записями, которую хочу разделить между проектами, которые в противном случае имеют совсем другую бизнес-логику. Поэтому я делюсь своими учетными и администраторскими контроллерами, но другие контроллеры имеют специфику для своих соответствующих проектов.
Ответ 3
Простейшей формой разделения, которую я использую, является сохранение представлений "как есть" в исходном проекте MVC, но удаление контроллеров. Затем в новом проекте ClassLibrary добавьте классы Controller и убедитесь, что они наследуются от Controller.
Механизм маршрутизации MVC автоматически перейдет к контроллерам в ClassLibrary, и Контроллеры автоматически построят представления из исходного проекта MVC, если вы правильно разместите свои ссылки и правильные данные.
Я использую эту архитектуру для реализации модуля Html Reports, который может быть скомпилирован и развернут отдельно от основного решения. Наконец, я свободен от SSRS!
Ответ 4
- Добавьте библиотеку классов для вашего проекта mvc.
-
В классе добавьте следующий код (для кода контроллера u'r)
namespace ContactController
{
public class ContactController : Controller
{
public ActionResult Call()
{
ViewBag.Title = "Inside MyFirst Controller.";
return View();
}
}
}
-
В папке просмотра проекта mvc добавьте папку для контакта и создайте файл Call.cshtml.
![View Folder]()
-
Добавьте ссылку на проект библиотеки классов в ваш основной проект MVC.
![Reference]()
- Наконец, чтобы передать пространство имен контроллеров имен в Route Config.
![RouteConfig]()