我希望能够将这些特定警告标记为已接受 [...] 这可能吗?
不,当前 (2.2.3) 版本无法做到这一点。整个诊断 API 是内部的。可以在单元测试中使用反射来触发诊断验证,并过滤掉您不感兴趣的警告。如果还有任何警告,您可以让测试失败。
这是可能的,但确实需要一些工作,并且在大多数情况下,您不希望有任何潜在的生活方式不匹配违规行为。有关潜在生活方式不匹配的文档指出:
不要忽略这些警告。此警告的误报很少见,即使发生错误,注册或应用程序设计也可以随时更改,使警告消失。
在您的情况下,您的 Lifetime Scoped 实例是指瞬态,您似乎意识到这可能存在风险,并且您似乎已经检查过这不是问题。不过,将来当类更改时,这可能会成为一个问题,如果您没有明确记录这一点,其他开发人员可能会被误导。
通常有多种方法可以解决此问题。例如,您可以将瞬态依赖提升到生命周期范围,但您可能已经考虑过这一点。另一种选择是让ObjectMaterializedSubscriber
不依赖于 transient IEventPublisher
,而是依赖于 singleton Func<IEventPublisher>
,可以如下注册:
container.RegisterSingle<Func<IEventPublisher>>(
() => container.GetInstance<IEventPublisher>());
这使得ObjectMaterializedSubscriber
通信的代码清楚地表明它期望获得一个生命周期较短的对象,即使它IEventPublisher
被请求一次。
其他两个警告(我假设)是由我使用 SimpleInjector Decorator 工具构建责任链引起的。
不幸的是,您在 2.2.1 版本中偶然发现了一个错误。问题不是由添加装饰器引起的,而是由使用未注册的类型解析引起的。此错误已在 2.2.3 中修复。
更新
从 Simple Injector 2.4 开始,有一个诊断 API允许您以编程方式与诊断服务交互。这允许您编写单元测试并过滤掉任何不需要的警告,然后让单元测试验证您是否没有任何警告。例子:
[TestMethod]
public void Container_Always_ContainsNoDiagnosticWarnings()
{
// Arrange
var container = Bootstrapper.GetInitializedContainer();
container.Verify();
// Assert
var results = Analyzer.Analyze(container);
Assert.IsFalse(results.Any(), Environment.NewLine +
string.Join(Environment.NewLine,
from result in results
select result.Description));
}