2

我有一个包含一些控制器的 WebApi 应用程序(它们是使用扩展方法 RegisterApiControllers 注册的)。此应用程序引用了另一个程序集,其中包含我不想公开的其他控制器(我已检查它们是否未在容器中注册)。碰巧两者都有一个 OrderController,当我尝试访问 /api/Order url 时,我得到一个异常“找到与名为‘order’的控制器匹配的多种类型。” 堆栈跟踪显示我在 DefaultHttpControllerSelector 中。

我已经看到 AutofacControllerFactory 曾经存在,甚至还有一个注册它的 ConfigureWebApi,但它不再存在于默认分支中。(你可以在这里看到它http://alexmg.com/post/2012/03/09 /Autofac-ASPNET-Web-API-(Beta)-Integration.aspx )

似乎我们也无法在 WebApi 中过滤路由定义的命名空间(MVC 是可能的)。

那么关于如何仅使用在我的 Autofac 容器中注册的控制器而不使用似乎扫描所有引用的程序集以发现控制器的 DefaultHttpControllerSelector 的任何想法?

谢谢

4

1 回答 1

3

问题是使用 autofac 注册控制器与路由过程并不真正相关。只有当路由进程确定了要分派到哪个控制器时,才会调用 Autofac 来解析类型。看起来,从源代码中挖掘,您需要编写一个替换IHttpControllerSelector来处理两个具有相同名称的控制器。(这真的很糟糕顺便说一句)。
您可能可以将 替换DefaultHttpControllerTypeResolver为传递谓词的实例,该谓词从您要忽略的程序集中过滤掉控制器。这是一个有点笨拙的解决方案,但可能会奏效。

实际上,您可能能够将 DefaultHttpControllerTypeResolver 完全替换为基于 Autofac 容器中注册的解析器。这是一个非常简单的接口,所以只要 Autofac 有某种发现机制,你应该是金。

   public interface IHttpControllerTypeResolver
    {
      ICollection<Type> GetControllerTypes(IAssembliesResolver assembliesResolver);
    }
于 2013-05-07T16:00:29.570 回答