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

时间:2015-02-16 13:52:04

标签: c# ioc-container simple-injector

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

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

1 个答案:

答案 0 :(得分:4)

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

  

在以下情况下可以安全地忽略此警告:Dispose被调用   应用程序代码

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

尽管可以安全地将Web API控制器的生活方式增加到每个web-api-request,但通常最好将根对象保留为瞬态。促进生活方式将迫使您促进这些依赖关系的生活方式,并且将导致应用程序中的每个注册至少按网络请求。虽然这可以安全地完成而没有任何问题,但这可能会使您的注册更复杂,并且可能影响解析大对象图的速度。

因此,警告在您的情况下是误报。它可以安全地被忽略。如果集成库抑制这些警告会很好。我刚刚创建了一个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)));