【问题标题】:ASP.NET Core - Overriding the default ControllerFactoryASP.NET Core - 覆盖默认 ControllerFactory
【发布时间】:2017-09-30 02:09:17
【问题描述】:

我处于一个非常特定的情况,我想覆盖默认的 ASP.NET Core ControllerFactory。我想这样做是因为我想完全控制我处理每个请求的控制器类型。

场景是:

  1. 请求带有特定的子域
  2. 基于这个子域,我想在工厂里解析一个Generic类型的控制器

例如:

  1. category.website.com 被调用
  2. 我们看到它的类型是 category 并将使用通用的 HomeController<T> ,使用 DI 注入类别,因此类型是 HomeController<Category>
  3. HomeController<Category> 将使用Category 类型方法上的一些泛型方法来呈现主页。

如果我相信this link,那么DefaultControllerFactory 类型的工厂会在应用程序启动时注册。这似乎是不可替代的。

知道我会怎么做吗?对我们来说最合乎逻辑的选择是使用旧的 ASP.NET MVC 版本,它允许您设置自己的 ControllerFactory,但我们会失去能够使用 SpaServices 预渲染我们的 Angular 应用程序等功能。

【问题讨论】:

标签: c# dependency-injection asp.net-core asp.net-core-mvc


【解决方案1】:

在调用 AddMvc 之后,在 ConfigureServices 中注册您自己的实现:

services.AddSingleton<IControllerFactory, MyCustomControllerFactory>();

这样,每当要构建控制器时都会调用它。

为了完整起见,最好的方法是实际实现 IControllerActivator 并注册它,因为默认控制器工厂不是公共的。它将使用注册的任何 IControllerActivator 实现来实际创建控制器类。

【讨论】:

  • 我想它真的可以这么简单!我从阅读源代码中假设这是不可能的,但这实际上完成了我想要的工作。谢谢!
  • 没问题!您可能希望重用 DefaultControllerFactory 中的实现。如果这样做,请在 MyCustomControllerFactory 中添加与 DefaultControllerFactory 相同的参数,并使用这些参数在构造函数中实例化 DefaultControllerFactory 的私有字段,以便您可以委托给它。
  • 我刚刚开始弄清楚 DefaultControllerFactory 在引擎盖下的作用,所以这是救命稻草!谢谢!
猜你喜欢
  • 2021-09-22
  • 2018-04-21
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 2011-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多