我正在使用Umbraco,它有许多自定义Web API控制器。我想在简单的注入器中忽略它们,只需手动注册我自己的web api控制器。
我应该将控制器的生活方式注册为瞬态还是范围? Web api控制器实现了IDisposable
,但是如果我理解正确的话,简单的注入器在使用container.RegisterMvcControllers()
时会将它们注册为瞬态。如果使用web api时它们应该是瞬态的吗?如果是这样,我想我必须压制一次性警告?
注册怎么样?如果我只是执行container.Register<MyController>(Lifestyle.Transient)
并且我的控制器注入了另一个注册的接口,即public MyController(IMyRegisteredInterface foo)
,它将抛出异常Make sure that the controller has a parameterless public constructor
。
答案 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解析控制器。