Подтвердить что ты не робот

Asp.net mvc помещает контроллеры в отдельный проект

Я просто изучаю asp.net mvc, и я пытаюсь понять, как переместить мои контроллеры в отдельный проект. Обычно, когда я разрабатывал веб-приложения asp.net раньше, я создал один проект для своих моделей, другой для своей логики, а затем был веб-сайт.

Теперь, когда я изучаю asp.net mvc, я надеялся следовать аналогичной схеме и поместить модели и контроллеры в свои собственные отдельные проекты и просто оставить view/scripts/css в Интернете. Часть моделей была простой, но я не понимаю, как сделать мои контроллеры в отдельном проекте "найденными". Кроме того, я хотел бы знать, если это целесообразно. Спасибо!

4b9b3361

Ответ 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