【问题标题】:Can I write the results of SimpleInjectors diagnostics to a log file?我可以将 SimpleInjectors 诊断的结果写入日志文件吗?
【发布时间】:2013-05-17 14:21:48
【问题描述】:

使用 SimpleInjector,我在配置结束时调用container.Verify(),并在调试器中获取诊断信息,如the documentation 中所述。我想将该信息写入日志文件。有没有办法以编程方式访问它或将记录器或跟踪器挂接到 SimpleInjector 中?

【问题讨论】:

  • 你为什么要这样做?当您需要分析生产环境中发生的情况时,写入日志文件似乎很有用,但是您的开发盒和生产服务器上的 DI 配置之间的差异应该几乎没有什么不同,因此诊断结果将是相同的在您的机器和服务器上。
  • 我们目前正在努力开放诊断 API。这可能会在下一个次要版本(v2.4)中添加。
  • 我刚刚推送了一个alpha to NuGet,它将一个新的 SimpleInjector.Diagnostics.dll 添加到核心包中。您只需致电Analyzer.Analyze(container) 即可获取所有诊断警告的列表。欢迎任何反馈。
  • 听起来很不错。我会试试看的!

标签: .net ioc-container simple-injector


【解决方案1】:

ContainerDebugView 我猜可以归类为 SimpleInjector 中诊断机制的 Facade 类,仅用作 Container 类的 DebuggerTypeProxy。

它是一个带有公共构造函数的内部类,因此如果不使用反射和 Activator 类就无法构造它。但是,如果您这样做,您应该能够使用容器调用构造函数,然后使用 Items 属性获取 DebuggerViewItem 数组,其中包含配置中警告和错误的名称、描述等。

希望这会有所帮助,因为我当然可以理解为什么您可能希望能够在不使用调试器的情况下查看错误。 (例如在单元测试中)

【讨论】:

    【解决方案2】:

    Simple Injector 2.4 包含一个diagnostic API (SimpleInjector.Diagnostics.dll),允许您查询容器以获取诊断警告。使用此 API,您可以编写自动检查诊断警告配置的集成测试:

    // using SimpleInjector.Diagnostics;
    
    [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));
    }
    

    当然,您也可以将其写入文件:

    var results = Analyzer.Analyze(container);
    
    File.WriteAllLines("c:\\diagnostic.txt", results.Select(r => r.Description));
    

    【讨论】:

    • 谢谢,这似乎可以满足我的需求。顺便说一句,如果您有兴趣在不诉诸反思的情况下将其曝光,我可以尝试一下并向您发送 PR。
    • 感谢您的提议,但系统的这一部分是内部的,这是有原因的。我不想公开,除非我很确定 API 是正确的。例如,此功能将来可能会获得自己的程序集并且会有所改变。这就是为什么它现在不开放。如果给您带来不便,我们深表歉意。
    • 没问题。我很感激。
    猜你喜欢
    • 2018-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多