我正在关注简单的注入器文档站点上的文档。
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();
答案 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)));