在运行时从另一个程序集加载控制器

本文关键字:加载 控制器 程序集 另一个 运行时 | 更新日期: 2023-09-27 18:22:49

在我的项目中,在global.asax中注册路由之前,我在主web程序集中加载了一些外部程序集。其中一些程序集内部有MVC控制器和视图。

我的问题是,由于某种原因,这些外部控制器没有被拾取,我认为控制器注册发生在加载程序集之前的某个地方,因为如果我在应用程序启动之前引用程序集(bin文件夹中的dll),一切都会正常工作。

所以我想知道是否有

  • 一种控制mvc控制器何时注册的方法,这样我就可以在加载所有程序集后进行注册?或
  • 注入外部控制器的方法

我以前在WebAPI控制器上也遇到过类似的问题,我可以通过使用自定义HttpControllerSelector来修复它,但在MVC中还找不到类似的东西。

在运行时从另一个程序集加载控制器

能够通过重写DefaultControllerFactoryCreateController方法来解决问题:

应用程序启动:

IControllerFactory factory = new ControllerFactory();
ControllerBuilder.Current.SetControllerFactory(factory);

控制器工厂:

public class ControllerFactory : DefaultControllerFactory
{
    public override IController CreateController(RequestContext requestContext, string controllerName)
    {
         IController controller = null;
         Type controllerType;
         if (ControllerTypes.TryGetValue(controllerName.ToLower(), out controllerType))
         {
              controller = (IController) Activator.CreateInstance(controllerType);
         }
         return controller;
    }
    ...
}

ControllerTypes是来自外部程序集的MVC控制器的字典。