gpt4 book ai didi

c# - Web API Controller 的简单注入(inject)器生活方式警告

转载 作者:太空狗 更新时间:2023-10-29 21:44:22 34 4
gpt4 key购买 nike

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

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.

我不确定如何将 Controller 的范围设置为方法 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 框架注册 Controller 以供处置,因此对于 Web API Controller 可以安全地忽略此警告。

虽然 Web API Controller 的生命周期可以安全地增加到 per-web-api-request,但通常最好让根对象保持 transient 。提升生活方式将迫使您也提升那些依赖项的生活方式,并将导致应用程序中的每个注册至少是每个 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)));

关于c# - Web API Controller 的简单注入(inject)器生活方式警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28542970/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com