【问题标题】:Simple injector lifestyle warnings for web api controllersWeb api 控制器的简单注入器生活方式警告
【发布时间】:2015-04-17 01:19:15
【问题描述】:

我正在关注简单注射器文档网站上的文档。

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 包的一部分并且没有任何重载。如何将这些设置为每个 Web 请求?在其他地方我会这样做container.Register<IPinger, Pinger>(lifestyle);,但似乎我应该使用打包的辅助方法


添加此行以过滤掉不需要的假阴性

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

【问题讨论】:

  • 为什么要编写测试来检查 DI 配置?在不运行应用程序的情况下几乎不可能检查 DI 配置是否有效,实际上,Verify 方法本身并不是很有用:blog.ploeh.dk/2011/12/21/TestingContainerConfigurations,即使根据您提供的文档链接也是如此。
  • 很公平,也许应该从文档中删除它?
  • 我不同意 NightOwl 和 Mark 的文章。尽管可能无法获得 100% 的确定性,但是当您关注 certain rules 时,验证和诊断您的容器将为您提供良好的确定性。在与开发人员团队合作时,我认为验证和诊断您的 DI 配置几乎是一项要求。

标签: c# ioc-container simple-injector


【解决方案1】:

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

在以下情况下可以安全地忽略此警告: Dispose 由 申请代码

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

虽然 Web API 控制器的生活方式可以安全地增加到 per-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)));

【讨论】:

  • 感谢您这么快的回答!我将过滤掉控制器的警告。顺便说一句,很棒的图书馆和深入的文档有很大帮助!
  • @Niel:查看我的更新以了解如何抑制这些警告。您可以过滤DisposableTransientComponentDiagnosticResult
  • @Neil:我们刚刚推送了a beta of v2.8 to NuGet,它在 Web API 控制器上抑制了这个警告。我真的很想知道这个测试版对你有什么影响。
  • @Steven,我刚刚升级到 3.0.5,所以我想这个问题从未解决?
  • @Rogier21 我遇到了同样的错误,但在版本 3.0.3 上。在确保所有 Simple Injector 软件包都更新到 3.0.5 之后,我执行了一个 Clean Project,然后是 Rebuild Project。问题似乎已经消失,所以也许只是您的 \bin 文件夹中的二进制文件没有更新?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多