简单的注入器容器无法从Pluggedin外部库注册Web API控制器

时间:2015-02-17 17:11:15

标签: c# asp.net-web-api2 simple-injector

在容器上调用扩展方法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());

我几乎把所有的头发拉出来,因为我似乎无法看出我做错了什么。感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

很难具体,但这里列出了可能导致您的控制器无法注册的事项:

  • 您的ApiAssemblyResolver不会返回包含控制器的程序集。
  • 该程序集是一个动态程序集(意味着Assembly.IsDynamic返回true)。 Web API将跳过动态程序集。
  • 控制器类型是内部的。 Web API仅使用公共类型。
  • 控制器类型不是类(但结构)。
  • 他们的类型名称不以&#34; Controller&#34;
  • 结尾
  • 他们没有实施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);