C# web api控制器的简单警告
我正在关注simple injector docs网站上的文档 但是,当我运行测试时,我得到以下错误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
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)));