【问题标题】:Load Controllers at runtime from another assembly在运行时从另一个程序集加载控制器
【发布时间】:2013-07-17 19:00:34
【问题描述】:

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

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

所以我想知道有没有

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

我之前在使用 WebAPI 控制器时遇到过类似的问题,我可以通过使用我的自定义 HttpControllerSelector 来解决它,但我还没有在 MVC 中找到类似的东西。

【问题讨论】:

  • 创建自己的控制器工厂?使用可以包含多个源的 DI 容器(大多数在其配置中具有此功能,例如 cfg.FromAssembly("My.Other.Asm")

标签: c# asp.net-mvc asp.net-mvc-4


【解决方案1】:

能够通过覆盖 DefaultControllerFactoryCreateController 方法来解决问题:

Application_Start:

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 控制器的字典。

【讨论】:

  • 那么你将如何构建那本词典?
【解决方案2】:

参见thisthis - 使用castle windsor 等创建自定义控制器工厂

【讨论】:

  • 我要去看看,但乍一看,对于这样一个简单的任务来说,这似乎有点过头了。
  • @MaksimVi.: 矫枉过正?从表面上看可能是为了完成这项任务,但如果您开始使用 DI,您将成为一名更好的开发人员。
  • @BradChristie,进入其他技术/模式/实践不会自动使您成为更好的开发人员。对于这个问题,它看起来像是灵丹妙药,但如果你能帮助我理解在我的特定示例中如何从 IoC 中受益,我可能会重新考虑。
  • @MaksimVi.:不让自己接触其他“技术/模式/实践”就像是一个只有锤子和锯子的木匠;确保你能过得去,腰带上的工具越多,你开发可靠产品的机会就越大。 IoC 不是灵丹妙药,你说得对——但它确实有助于执行模块化开发和消除依赖关系。您还强迫自己创建抽象级别,而不是坚持固定的实现(这有助于单元测试和更强大的解决方案以及最终维护的时间更少)。
  • @BradChristie 如果我告诉你那里有比你可能学的更多的技术怎么办?在 IoC 和 DI 的情况下,您显然比我知道的更多,正如我所说,我将仔细研究它,但是对于我的问题(在 MVC 框架环境中注册控件)中的问题,您仍然没有告诉我如何从使用这些方法中受益。
猜你喜欢
  • 1970-01-01
  • 2013-01-04
  • 2012-12-19
  • 1970-01-01
  • 2012-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多