网络 api 控制器的简单注射器生活方式警告

Simple injector lifestyle warnings for web api controllers

我正在关注简单注入器文档站点上的文档。

https://simpleinjector.readthedocs.org/en/latest/diagnostics.html

var container = new Container();
container.RegisterWebApiControllers(config);
container.Verify();

var results = Analyzer.Analyze(container);

results.Should()
  .HaveCount(0, String.Join( Environment.NewLine, results.Select(x => x.Description)));

然而,当我 运行 我的测试时,我得到以下错误

Xunit.Sdk.AssertException: 
Expected collection to contain 0 item(s) because 
MyController is registered as transient, but implements IDisposable., 
but found 1.

我不确定如何设置控制器的范围,因为方法 container.RegisterWebApiControllers(config) 是 webapi 包的一部分并且没有任何重载。我如何将这些设置为每个网络请求?在其他地方我会这样做 container.Register<IPinger, Pinger>(lifestyle); 但似乎我应该使用打包的辅助方法


添加此行以过滤掉不需要的漏报

results = results.Where(x => 
   !(x.ServiceType.BaseType == typeof (ApiController) && 
     x.Description.Contains("IDisposable"))
    ).ToArray();

Disposable Transient Components 页面包含有关此警告的更多信息并指出:

This warning can safely be ignored when: Dispose is called by the application code

在 Web API 的情况下,Web API 框架注册控制器进行处置,因此对于 Web API 控制器可以安全地忽略此警告。

虽然 Web API 控制器的生活方式可以安全地增加到每个 Web-api-请求,但通常最好让根对象保持瞬态。提升生活方式将迫使您也提升那些依赖项的生活方式,并将导致应用程序中的每个注册至少是每个 Web 请求。虽然这可以安全地完成,没有任何问题,但这会使您的注册稍微复杂一些,并且会影响解析大对象图的速度。

因此在您的案例中警告是误报。可以安全地忽略它。如果集成库抑制这些警告就好了。我刚刚创建了一个 work item for this。期待它在未来的版本中得到修复。

您可以使用以下代码来抑制这些警告:

var results = 
    from result in Analyzer.Analyze(container)
    let disposableController =
        result is DisposableTransientComponentDiagnosticResult &&
        typeof(ApiController).IsAssignableFrom(result.ServiceType)
    where !disposableController
    select result;

results.Should().HaveCount(0, String.Join(Environment.NewLine,
    results.Select(x => x.Description)));