0

SimpleInjector 验证功能不时突出显示我需要修复的问题。但是,我确实有一些我很满意的“潜在”问题,我想以某种方式告诉 SimpleInjector 这些都可以,请告诉我其余的...

  • 配置警告 已检测到多个组中的警告。
    • 潜在生活方式不匹配 1 项服务可能存在 1 处不匹配。
      • IObjectMaterializedSubscriber ObjectMaterializedSubscriber(Lifetime Scope) 取决于IEventPublisher(Transient)。
    • 潜在的单一职责违规 2 个可能的违规。
      • ILetterGenerator<A> LetterGenerator<A>有 9 个依赖项,这可能表明违反了 SRP。
      • ILetterGenerator<B> LetterGenerator<B>有 9 个依赖项,这可能表明违反了 SRP。

作为瞬态的第一个警告IEventPublisher很好。其他两个警告(我假设)是由我使用 SimpleInjector Decorator 工具构建责任链引起的。

我希望能够将这些特定警告标记为已接受,以便容器可以报告一切似乎都正常!

这可能吗?

4

1 回答 1

0

我希望能够将这些特定警告标记为已接受 [...] 这可能吗?

不,当前 (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));
}
于 2013-05-04T23:59:17.577 回答