在简单的进样器中手动注册web api控制器

时间:2017-05-23 16:40:20

标签: c# simple-injector

我正在使用Umbraco,它有许多自定义Web API控制器。我想在简单的注入器中忽略它们,只需手动注册我自己的web api控制器。

  1. 我应该将控制器的生活方式注册为瞬态还是范围? Web api控制器实现了IDisposable,但是如果我理解正确的话,简单的注入器在使用container.RegisterMvcControllers()时会将它们注册为瞬态。如果使用web api时它们应该是瞬态的吗?如果是这样,我想我必须压制一次性警告?

  2. 注册怎么样?如果我只是执行container.Register<MyController>(Lifestyle.Transient)并且我的控制器注入了另一个注册的接口,即public MyController(IMyRegisteredInterface foo),它将抛出异常Make sure that the controller has a parameterless public constructor

1 个答案:

答案 0 :(得分:3)

  

我想在简单的注入器中忽略它们,只需手动注册我自己的web api控制器

您可以轻松忽略它们,同时仍然享受批量注册,只需将您希望扫描的程序集提供给RegisterWebApiControllers方法,如下所示:

container.RegisterWebApiControllers(httpConfiguration,
    typeof(MyApiController).Assembly);
  

我应该将控制器的生活方式注册为瞬态还是范围?

您可以同时执行这两项操作,但将它们注册为瞬态通常是最简单的,因为这样可以防止其所有依赖项也应该是Scoped。除此之外,由于ApiController实现了IDisposable,这意味着您必须禁止DisposableTransientComponent诊断警告。这实际上是Web API中的一个设计缺陷,因为基类和接口通常应该实现IDisposable。可以抑制此警告,因为Web API将确保处置。

最简单的方法是使用RegisterWebApiControllers方法提供的批量注册工具,因为它会自动为您禁止此警告。

  

确保控制器具有无参数的公共构造函数。

请务必遵循Web API Integration Guide,尤其要使用SimpleInjectorWebApiDependencyResolver;它将确保通过Simple Injector解析控制器。