在容器上调用扩展方法container.RegisterWebApiControllers(GlobalConfiguration.Configuration)
时会注意到这个问题,该容器应该使用容器注册web api控制器但是没有。请注意,web api控制器在不同的类库项目中定义,并在应用程序启动时使用自定义IAssembliesResolver
类型进行插入。
public static class SimpleInjectorWebApiInitializer
{
public static void Initialize()
{
var container = new Container();
GlobalConfiguration.Configuration.Services.Replace(typeof(IAssembliesResolver),
new ApiAssemblyResolver());
InitializeContainer(container);
container.RegisterWebApiControllers(GlobalConfiguration.Configuration);
container.Verify();
GlobalConfiguration.Configuration.DependencyResolver =
new SimpleInjectorWebApiDependencyResolver(container);
}
我甚至尝试调用手动获取ControllerTypes
以查看使用下面的代码发生了什么,但它从未触发GetAssemblies
方法,也没有返回任何ControllerTypes
。< / p>
var controllerTypes = httpConfigServicesContainer.GetHttpControllerTypeResolver()
.GetControllerTypes(
GlobalConfiguration.Configuration.Services.GetAssembliesResolver());
我几乎把所有的头发拉出来,因为我似乎无法看出我做错了什么。感谢您的帮助。
答案 0 :(得分:2)
很难具体,但这里列出了可能导致您的控制器无法注册的事项:
ApiAssemblyResolver
不会返回包含控制器的程序集。Assembly.IsDynamic
返回true
)。 Web API将跳过动态程序集。IHttpController
。IAssembliesResolver
未正确注册(可能您缺少绑定重定向,导致您的应用程序引用两个版本的Web API)。提示:检查GlobalConfiguration.Configuration.Services.GetAssembliesResolver()
类型实际解析的内容。同时尝试以下方法:
var controllerTypes = httpConfigServicesContainer.GetHttpControllerTypeResolver()
.GetControllerTypes(new ApiAssemblyResolver());
这会导致任何控制器吗?在这种情况下,调用Replace(typeof(IAssembliesResolver)
可能会遗漏一些内容。
答案 1 :(得分:1)
解决方案按照进行配置调用的顺序排列。我将每个涉及IOC容器的配置调用移动到Global.asax文件的Application_Start方法中。
在致电GlobalConfiguration.Configure(WebApiConfig.Register)
之前,
我已经打电话了
GlobalConfiguration.Configuration.Services.Replace(typeof(IAssembliesResolver), new ApiAssemblyResolver())
替换默认的程序集解析程序。我终于在每次其他配置调用之后放置了其他容器web api配置设置,它开始像魅力一样工作!即
var apiIOCContainer = new Container();
SimpleInjectorWebApiInitializer.InitializeContainer(apiIOCContainer);
apiIOCContainer.RegisterWebApiControllers(GlobalConfiguration.Configuration);
GlobalConfiguration.Configuration.DependencyResolver =
new SimpleInjectorWebApiDependencyResolver(apiIOCContainer);