【问题标题】:Implementing Custom Controller Factory involving multiple Assemblies实现涉及多个程序集的自定义控制器工厂
【发布时间】:2015-03-18 00:04:44
【问题描述】:

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

在使用我们的自定义控制器工厂时,我们使用反射来拉取并创建一个正确控制器类型的实例,该控制器类型应基于哪个程序集作为目标。我已经对此进行了调试,并确认结果返回了正确的控制器。

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

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

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

当我实现了一个应该决定选择哪个控制器来使用动作方法的自定义控制器工厂时,期待任何关于 MVC 为何会这样行为的建议或知识。提前致谢!

【问题讨论】:

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


    【解决方案1】:

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

    [Route("Customer/Lookup/{name}")] public ActionResult LookupByName(string name) { // Custom code content here }

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

    routes.MapRoute( name: "CustomerLookup", url: "customer/lookup/{name}", defaults: new { controller = "Customer", action = "LookupByName", name = UrlParameter.Optional } );

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-28
      • 1970-01-01
      • 2021-04-25
      相关资源
      最近更新 更多