c# – 实现涉及多个程序集的自定义控制器工厂

目前,我们正在尝试在API中实现自定义控制器工厂,以确定要使用的正确控制器,具体取决于传入API的标识符令牌.这个项目的设置方式是每个不同的公司(只有大约5个)都有自己的程序集,其中包含自定义控制器,这些控制器具有执行某人试图执行的任何操作所需的操作方法.我发送的要求之一是控制器必须在这些程序集中命名相同.例如,您可以拥有四个不同的控制器,每个控制器位于一个名为CustomerController的不同程序集中.这四个控制器都包含同样命名的Action方法,但它们中的实现完全不同.

在使用我们的自定义控制器工厂时,我们使用Reflection来拉取并创建一个正确的控制器类型的实例,该实例应该针对哪个程序集.我调试了这个,并确认正在返回正确的Controller.

发生的问题发生在Action Method调用期间.即使我们的控制器工厂正在为我们的请求返回正确的控制器,似乎MVC可能预装了这些组件中的每个控制器,并且仍然将这些作为可能的方向.我们在调用Action方法时遇到的确切错误是:当前请求在以下操作方法之间不明确

有没有办法告诉MVC忽略控制器工厂的请求中没有返回的其他控制器,这样它就知道不会试图查看似乎没有加载的其他控制器?如果MVC只是要检查所有其他控制器的Action Method匹配,那么ControllerFactory有什么意义呢?我必须在这里找到一些东西.

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

当我实现一个自定义控制器工厂时,期待有关MVC为什么会这样做的任何建议或知识,该控制器工厂应该决定选择使用Action方法的Controller.提前致谢!

解决方法

我们找到了解决方案.控制器工厂按预期工作.问题实际上在我们的路由中.在实现此解决方案之前,我们已使用Route属性标记了Action Methods.因此,例如,对于我们所拥有的不同组件中的每个控制器

〔路线( “客户/查寻/ {名称}”)]
public ActionResult LookupByName(string name)
{
    //此处自定义代码内容
}

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

routes.MapRoute(    名称:“CustomerLookup”,    url:“customer / lookup / {name}”,    认值:new {controller =“Customer”,action =“LookupByName”,name = UrlParameter.Optional});

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...