Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# web api控制器的简单警告_C#_Ioc Container_Simple Injector - Fatal编程技术网

C# web api控制器的简单警告

C# web api控制器的简单警告,c#,ioc-container,simple-injector,C#,Ioc Container,Simple Injector,我正在关注simple injector docs网站上的文档 但是,当我运行测试时,我得到以下错误 Xunit.Sdk.AssertException: Expected collection to contain 0 item(s) because MyController is registered as transient, but implements IDisposable., but found 1. 我不确定如何将控制器的作用域设置为方法容器。RegisterWebAP

我正在关注simple injector docs网站上的文档

但是,当我运行测试时,我得到以下错误

Xunit.Sdk.AssertException: 
Expected collection to contain 0 item(s) because 
MyController is registered as transient, but implements IDisposable., 
but found 1.
我不确定如何将控制器的作用域设置为方法
容器。RegisterWebAPI控制器(配置)
是webapi包的一部分,没有任何重载。如何将这些设置为每个web请求?在其他地方我会这样做
container.Register(生活方式)但是我似乎应该使用打包的helper方法


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

results = results.Where(x => 
   !(x.ServiceType.BaseType == typeof (ApiController) && 
     x.Description.Contains("IDisposable"))
    ).ToArray();
该页面包含有关此警告的详细信息,并说明:

当调用:Dispose时,可以安全地忽略此警告 应用程序代码

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

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

因此,在你的情况下,警告是假阳性。可以放心地忽略它。如果集成库抑制这些警告,那就好了。我刚刚创建了一个。希望它在将来的版本中得到修复

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

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

为什么要编写测试来检查DI配置?如果不运行应用程序,几乎不可能检查DI配置是否有效,事实上,即使根据您提供的文档链接,验证方法本身也不是很有用。公平地说,也许应该从文档中删除它?我不同意NightOwl和Mark的文章。尽管可能无法获得100%的确定性,但当您遵循时,验证和诊断您的容器将为您提供良好的确定性。在与开发团队合作时,验证和诊断您的DI配置几乎是一项要求。感谢您如此快速的回答!我将过滤掉控制器的警告。顺便说一句,伟大的图书馆和深入的文档帮助很大@Niel:查看我的更新以了解如何抑制这些警告。您可以在
DisposableTransientComponentDiagnosticResult
上进行筛选@Neil:我们刚刚按下按钮,它将在Web API控制器上抑制此警告。我真的很想知道这个测试版对你有什么影响。@Steven,我刚升级到3.0.5,所以我想这个问题从来没有解决过?@Rogier21我也遇到了同样的错误,但在3.0.3版上。在确保所有的Simple Injector包都更新到3.0.5之后,我执行了一个干净的项目,然后重建了项目。问题似乎已经消失,所以可能只是\bin文件夹中的二进制文件尚未更新?
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)));