C# 使用简单注入器注册Web API控制器的子集
我正在手动注册项目的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); 它似乎会影响项
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()
在属性类中。因为我不能使用属性的构造函数,所以我只能使用属性注入器或服务定位器,对吗?为什么要在属性中配置容器。我认为这是绝对不允许的。容器应该一次(在启动期间)配置在一个位置(合成根)。