c# - 实现涉及多个程序集的自定义 Controller 工厂

标签 c# asp.net-mvc model-view-controller controller controller-factory

目前,我们正尝试在我们的 API 中实现自定义 Controller 工厂,以根据传递到我们 API 的标识符 token 来确定要使用的正确 Controller 。这个项目的设置方式是每个不同的公司(只有大约 5 个)都有自己的程序集,其中包含自定义 Controller ,这些 Controller 具有执行某人试图执行的任何操作所需的操作方法。我收到的其中一项要求是,这些程序集中的 Controller 必须具有相同的名称。因此,例如,您可以有四个不同的 Controller ,每个 Controller 都在一个不同的程序集中,所有 Controller 都命名为 CustomerController。这四个 Controller 都包含名称相同的 Action 方法,但它们内部的实现完全不同。

当使用我们的自定义 Controller 工厂时,我们使用反射来拉取并创建一个正确 Controller 类型的实例,该实例基于应该定位的程序集。我对此进行了调试,并确认结果返回了正确的 Controller 。

问题发生在操作方法调用期间。尽管我们的 Controller Factory 正在为我们的请求返回正确的 Controller ,但似乎 MVC 可能已经从这些程序集中预加载了每个 Controller ,并且仍在将它们视为一个可能的方向。我们在调用操作方法时遇到的确切错误是:The current request is ambiguous between the following action methods

有没有办法告诉 MVC 忽略 Controller 工厂请求中未返回的其他 Controller ,以便它知道不要尝试查看其他似乎未加载的 Controller ?如果 MVC 只是要检查所有其他 Controller 的 Action 方法匹配,那么 ControllerFactory 有什么意义?这里一定有我想念的东西。

我发现解决此问题的唯一其他解决方案是向所有涉及的操作方法添加 ActionMethodSelector 属性。然而,当向前看并考虑到每个单独的 Action Method 都需要在它们之间重复相同的属性时,这使得解决方案非常脆弱。

当我实现了一个自定义 Controller 工厂时,我期待任何关于为什么 MVC 以这种方式运行的建议或知识,该 Controller 工厂应该决定选择哪个 Controller 来使用 Action 方法。提前致谢!

最佳答案

我们找到了解决方案。 Controller 工厂按预期工作。问题实际上出在我们的路由中。在实现此解决方案之前,我们已使用 Route 属性标记我们的操作方法。因此,例如,对于我们拥有的不同程序集中的每个 Controller

[路线(“客户/查询/{名称}”)] 公共(public) ActionResult LookupByName(字符串名称) { //这里自定义代码内容 }

事实证明,在这些 ActionMethods 上指定 Route 属性优先于所选 Controller ,并且无论如何都会调用与当前请求的 Controller /操作匹配的所有 Controller 。我们的解决方案是删除此属性并将所需的内容放入 RouteConfig.cs 文件中,以便动态加载它并将完全控制权返回给我们的自定义 Controller 工厂,以决定哪个 Controller 专门用于所选的 ActionMethod。

路线.MapRoute( 名称:“客户查询”, 网址:“客户/查找/{名称}”, 默认值:new { controller = "Customer", action = "LookupByName", name = UrlParameter.Optional } );

关于c# - 实现涉及多个程序集的自定义 Controller 工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28033858/

相关文章:

c# - 在 Windows Azure 上部署时自定义 app.config

c# - 使用的是哪个版本的 web.config?

javascript - 无法在 Angular 2 中从 JSON 加载数据

c# - 不同类中的相同变量名,但一个可以为空

c# - 网络聊天应用程序 - ASP.NET/Jabber/Ajax/WCF/Comet/ReverseAjax - 面临的问题 - 寻求见解

c# - builder 模式中 builder 的创建

c# - 如何在使用 AddNewtonsoftJson 时在 asp net core 3.1 mvc 中通过 DI(服务集合)检索 json 序列化程序设置

asp.net-mvc - 如何从 ControllerContext 获取结果类型

java - 如何使用 MVC 设计模式观察嵌套对象

php - 在 MVC 中处理 404 错误的最佳方法是什么?