asp.net mvc поместил контроллеры в отдельный проект - PullRequest
99 голосов
/ 30 декабря 2008

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

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

Ответы [ 5 ]

87 голосов
/ 30 декабря 2008

Прежде всего, это хорошая идея - поместить вашу модель в отдельный проект. Как вы обнаружили, это тривиально.

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

Если вы решите сделать это, то вам нужно будет сообщить платформе, как найти ваши контроллеры. Основной способ сделать это - предоставить свой собственный ControllerFactory. Вы можете взглянуть на исходный код DefaultControllerFactory, чтобы понять, как это делается. Подтипа этого класса и переопределения метода GetControllerType (string controllerName) может быть достаточно для выполнения того, что вы просите.

После того, как вы создали свой собственный ControllerFactory, вы добавляете следующую строку в Application_Start в global.asax, чтобы сообщить платформе, где его искать:

ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());

Обновление: Читать это сообщение и сообщения, на которые он ссылается для получения дополнительной информации. Смотрите также комментарий Фила Хаака к этому посту о:

ControllerBuilder.Current.DefaultNamespaces.Add(
    "ExternalAssembly.Controllers");

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

17 голосов
/ 14 февраля 2013

Хотя разумно создать собственную ControllerFactory, я обнаружил, что удобнее определять все мои контроллеры в каждом проекте, но выводить их из контроллеров в моем общем проекте:

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...
   }
}

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

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

1 голос
/ 09 июля 2018

Моя проблема была решена после того, как я обновил System.Web.Mvc Ссылку NuGet, поэтому MvcWebsite и Class Library используют одинаковые System.Web.Mvc версия

Нет необходимости добавлять пространства имен по умолчанию

1 голос
/ 02 июля 2015
  • Добавьте библиотеку классов для вашего проекта MVC.
  • В классе добавить следующий код (для кода контроллера)

    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

1 голос
/ 26 ноября 2013

Самая простая форма разделения, которую я использую, - это сохранить представления «как есть» в исходном проекте MVC, но удалить контроллеры. Затем в новом проекте ClassLibrary добавьте классы Controller и убедитесь, что они наследуются от Controller.

Механизм маршрутизации MVC автоматически направит контроллеры в ClassLibrary, и контроллеры автоматически создадут представления из исходного проекта MVC, при условии, что вы правильно указали и используете ссылки.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...