Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用简单注入器注册Web API控制器的子集_C#_Simple Injector - Fatal编程技术网

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

C# 使用简单注入器注册Web API控制器的子集,c#,simple-injector,C#,Simple Injector,我正在手动注册项目的Web API控制器的子集: container.Register(typeof(ILGTWebApiController), controllerType, Lifestyle.Transient); 很好。但是,当我跑步时: GlobalConfiguration.Configuration.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container); 它似乎会影响项

我正在手动注册项目的Web API控制器的子集:

container.Register(typeof(ILGTWebApiController), controllerType, Lifestyle.Transient); 
很好。但是,当我跑步时:

GlobalConfiguration.Configuration.DependencyResolver = 
    new SimpleInjectorWebApiDependencyResolver(container);
它似乎会影响项目中的所有Web API控制器。我想让其他的不受简单注射器的影响


如果我不运行上面的代码,simple injector会抱怨我的控制器没有空构造函数(因为我使用的是DI,所以它们显然没有空构造函数)。

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

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()));

谢谢Steven,看起来很好:)如果您有时间,可以问以下问题:使用此解决方案时,是否有任何对应于
GlobalConfiguration.Configuration.DependencyResolver.GetService的选项?
?我之所以问这个问题,是因为我在属性类中使用了该代码段。我认为解决这个问题的一种方法是全局公开
容器
,这样就可以从属性中访问它。这样暴露容器被认为是不好的做法吗?我想一个缺点是它不能被100%验证?对不起,你想做什么?你在属性中做什么?为什么?简而言之,我想访问容器注册,比如说
container.Register()
在属性类中。因为我不能使用属性的构造函数,所以我只能使用属性注入器或服务定位器,对吗?为什么要在属性中配置容器。我认为这是绝对不允许的。容器应该一次(在启动期间)配置在一个位置(合成根)。