Как зарегистрировать контроллер в ASP.NET MVC, когда класс контроллера находится в другой сборке?

Моя цель - изменить Регистрация контроллера asp.net mvc, чтобы я мог создавать контроллеры и представления в отдельной (дочерней) сборке и просто копировать файлы представления и библиотеки DLL в главное приложение MVC, и новые контроллеры эффективно «подключаются» к главному приложению. .

Очевидно, мне понадобится какой-то шаблон IoC, но я в недоумении.

Я хотел создать дочернюю сборку с system.web.mvc, а затем просто начать создание классов контроллеров, унаследованных от Контроллер :

Отдельная сборка:

using System.Web;
using System.Web.Mvc;

namespace ChildApp
{
    public class ChildController : Controller
    {
        ActionResult Index()
        {
            return View();
        }
    }
}

Ура, все в порядке. Но затем я попытался изменить реестр контроллеров хост-приложения для загрузки моего нового дочернего контроллера во время выполнения, и я запутался. Возможно, потому, что мне нужно более глубокое понимание C #.

В любом случае, я подумал, что мне нужно создать класс CustomControllerFactory . Итак, я начал писать класс, который переопределял бы метод GetControllerInstance () . Когда я набирал текст, intellisence выскочил:

Host MVC Application:

public class CustomControllerFactory : DefaultControllerFactory 
{
    protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
    {
        return base.GetControllerInstance(requestContext, controllerType);
    }
}

Теперь я в растерянности. Я не знаю, что это значит. Первоначально я собирался написать класс «Загрузчик контроллера», такой как локатор служб, например:

Хост-приложение MVC:

public class ControllerLoader
{
    public static IList<IController> Load(string folder)
    {
        IList<IController> controllers = new List<IController>();

        // Get files in folder
        string[] files = Directory.GetFiles(folder, "*.plug.dll");
        foreach(string file in files)
        {
            Assembly assembly = Assembly.LoadFile(file);
            var types = assembly.GetExportedTypes();
            foreach (Type type in types)
            {
                if (type.GetInterfaces().Contains(typeof(IController)))
                {
                    object instance = Activator.CreateInstance(type);
                    controllers.Add(instance as IController);
                }
            }
        }
        return controllers;
    }
}

А затем я планировал использовать свой список контроллеров для их регистрации в фабрике контроллеров. Но как? Я чувствую, что вот-вот разберусь с этим. Думаю, все сводится к следующему вопросу: как мне подключиться к return base.GetControllerInstance (requestContext, controllerType); ? Или мне вообще следует использовать другой подход?

27
задан ΩmegaMan 22 October 2017 в 01:03
поделиться

1 ответ

Ссылка на другую сборку из корневого проекта ASP.NET MVC. Если контроллеры находятся в другом пространстве имен, вам нужно изменить маршруты в global.asax, например:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
        namespaces: new[] { typeof(HomeController).Namespace }
    );

}

Обратите внимание на дополнительный аргумент namespaces для метода MapRoute.

27
ответ дан 28 November 2019 в 05:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: