我有一个包含一些控制器的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容器中注册的Controller并且不使用似乎扫描所有引用的程序集以发现控制器的DefaultHttpControllerSelector的呢?
由于
答案 0 :(得分:3)
问题是使用autofac注册控制器与路由过程无关。只有在路由进程确定要分派哪个控制器后,才会调用Autofac来解析该类型。
看起来,从源代码中挖掘,您需要编写替换IHttpControllerSelector
以便处理具有相同名称的两个控制器。 (这真的很糟糕BTW)
您可以将DefaultHttpControllerTypeResolver
替换为传递谓词的实例,该谓词从您要忽略的程序集中筛选出控制器。这是一个kludgy解决方案,但可能会有效。
实际上,您可以使用基于Autofac容器中的注册的DefaultHttpControllerTypeResol完全替换DefaultHttpControllerTypeResolver。这是一个非常简单的界面,所以只要Autofac有某种发现机制,你应该是金色的。
public interface IHttpControllerTypeResolver
{
ICollection<Type> GetControllerTypes(IAssembliesResolver assembliesResolver);
}