asp.net mvc поставив контролери в окремий проект


107

Я просто вивчаю asp.net mvc і намагаюся зрозуміти, як перенести контролери в окремий проект. Як правило, коли я раніше розробляв веб-додатки asp.net, я створив один проект для своїх моделей, інший - за своєю логікою, а потім з’явився Інтернет.

Тепер, коли я вивчаю asp.net mvc, я сподівався дотримуватися подібної схеми і розміщувати моделі та контролери кожен із своїх окремих проектів, і просто залишити представлення даних / сценарії / css в Інтернеті. Частина моделей була легкою, але я не розумію, як зробити так, щоб мої контролери в окремому проекті були "знайдені". Також я хотів би знати, чи це доцільно. Дякую!

Відповіді:


92

Перш за все, це, безумовно, гарна ідея поставити свою модель в окремий проект. Як ви виявили, це банально.

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

Якщо ви все-таки вирішите це зробити, то вам потрібно буде сказати структурі, як знайти своїх контролерів. Основний спосіб зробити це - поставити власний ControllerFactory. Ви можете подивитися вихідний код для DefaultControllerFactory, щоб отримати уявлення про те, як це робиться. Підтиснення цього класу та переосмислення методу GetControllerType (string controllerName) може бути достатньою для виконання того, що ви запитуєте.

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

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

Оновлення: прочитайте цю публікацію та повідомлення, на які вона посилається, для отримання додаткової інформації. Дивіться також коментар Філа Хакка до цієї публікації про:

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

... що не є повним рішенням, але, можливо, досить хорошим для простих випадків.


2
Дякую Крейгу! Це саме те, що я шукав. Чи існує ця інформація навіть в Інтернеті? Я гуляв по всьому за це з не великою долею. StackOverflow знову проходить!
Аарон Палмер

11
Я погоджуюся, що контролери обробляють введення користувача, маніпулюють моделлю, а потім передають дані на вигляд. Вони, як правило, дуже специфічні для програми. Будь-яка логіка, не характерна для програми, може бути краще в бібліотеці чи моделі. Але в основному контролери повинні бути з веб-проектом.
Зламаний

2
У мене є контролер помилок і перегляди, однакові між двома програмами. Для мене є сенс мати таких в одній збірці, якими можуть користуватися обидва додатки.
Вітрильний спорт по дзюдо

3
Чи не простіше тестувати контролери та використовувати IoC, коли контролери знаходяться в окремому проекті - це і буде основною причиною
Самуель G

1
@Chev, я не думаю, що це має ніяке значення. Перевірка ваших контролерів більше пов'язана з тим, як ви кодуєте їх , а не там, де вони живуть.
Craig Stuntz

19

Хоча розумно створити власний 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
Це спрацювало дуже добре, але мені довелося усунути зайвий код, щоб запобігти помилці маршрутизації
Кен Мак

Привіт, як я можу керувати маршрутизацією в цьому типі проектів? я хочу використовувати маршрутизацію атрибутів ...
محمد

Ви можете використовувати маршрутизацію атрибутів так само, як і раніше.
ЦеГай

2
Не впевнений, чому це не має більшої кількості відгуків ... я думаю, що набагато елегантніше, ніж прийнята відповідь. Дякую!
jleach

Це не працює для мене. Не могли б ви сказати, чи це .Net Core або .Net Framework?
Homayoun Behzadian

4
  • Додайте бібліотеку класів для свого проекту mvc.
  • У класі додайте наступний код (For u'r Controller Code)

    namespace ContactController
    {
    public class ContactController : Controller
    {
        public ActionResult Call()
        {
            ViewBag.Title = "Inside MyFirst Controller.";
            return View();
        }
    }

    }

  • У папку перегляду проектів mvc додайте папку для контакту та створіть файл Call.cshtml. Переглянути папку

  • Додайте посилання на проект бібліотеки класів у свій основний проект MVC.

Довідково

  • Нарешті, для перенаправлення простору імен контактних контролерів у налаштування маршруту.

RouteConfig


3
Це трохи прикро, що у вас є простір імен з таким самим ім'ям як контролер.
Маріуш Джамро

3

Мою проблему вирішили після оновлення System.Web.Mvcпосилання на NuGet, тому MvcWebsite та бібліотека класів використовують одну і ту ж System.Web.Mvcверсію

Не потрібно додавати простори імен за замовчуванням


Проблема полягала в тому, що веб-сайт MvcWeWe не викидав винятку, тоді як теперішня збірка mvc має нижчу версію, ніж бібліотека класів, на яку посилається бібліотека mvc,
Homayoun Behzadian

1

Найпростіша форма поділу, яку я використовую, - це збереження представлень "як є" в оригінальному проекті MVC, але видалення контролерів. Потім у новий проект ClassLibrary додайте класи Controller та переконайтесь, що вони успадковуються від Controller.

Двигун маршрутизації MVC автоматично здійснює маршрутизацію до Контролерів у ClassLibrary, а Контролери автоматично будують представлення з оригінального проекту MVC, за умови правильного розміщення ваших посилань та використання.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.