使用简单的注入器注册Web API控制器的子集

时间:2017-05-25 13:37:23

标签: c# simple-injector

我手动注册了项目的Web API控制器的一部分:

container.Register(typeof(ILGTWebApiController), controllerType, Lifestyle.Transient); 

工作正常。但是,当我跑:

GlobalConfiguration.Configuration.DependencyResolver = 
    new SimpleInjectorWebApiDependencyResolver(container);

它似乎影响了项目中的所有 Web API控制器。我想通过简单的喷射器保持其他的不受影响。

如果我不运行上面的代码,简单的注入器会抱怨我的控制器没有空的构造函数(他们显然不会,因为我使用的是DI)。

1 个答案:

答案 0 :(得分:1)

不是替换IDependencyResolver,而是创建一个自定义IHttpControllerActivator来解析控制器或回退到原始激活器,否则:

public sealed class MyControllerActivator : IHttpControllerActivator
{
    private readonly Container container;
    private readonly IHttpControllerActivator original;

    public MyControllerActivator(Container container, IHttpControllerActivator original)
    {
        this.container = container;
        this.original = original;
    }

    public IHttpController Create(
        HttpRequestMessage req, HttpControllerDescriptor desc, Type type)
    {
        if (type == typeof(ILGTWebApiController))
            return (IHttpController)this.container.GetInstance(type);

        return this.original.Create(req, desc, type);
    }
}

您可以按如下方式配置自定义MyControllerActivator

GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator),
    new MyControllerActivator(
        container,
        GlobalConfiguration.Configuration.Services.GetHttpControllerActivator()));