设置简单注入器的记录器

Set Simple Injector's Logger

我已经将我的应用程序设置为使用 Simple Injector 作为 DI 容器,我已经注册了所有 repositories/services 并且我正在寻找设置最新的步骤:记录简单的内容 Injector 在自己的业务中作为输出写入。

现在我不是在谈论如何注册记录器(在我的特定情况下我使用 log4net,但这适用于所有日志记录框架,但我如何告诉 Simple Injector 记录使用 log4net? 我没有看到任何 .Log,例如 Unity

简单注入器,在内部,根本不记录任何东西。这是一个非常明确的设计决策,因为 Simple Injector 的 API 不是通过一个没人会看的日志系统来报告警告和错误,而是专门为防止错误而设计的,它会在检测到问题时抛出异常,例如作为歧义。

传达问题的异常在几个阶段抛出。首先,在注册期间检查各种条件和限制。其次,当调用 .Verify() 时,Simple Injector 检查它是否可以构建所有已注册的类型并进行各种分析以验证您的对象图是否结构合理。作为最后的手段,如果 Verify 未被调用,则在第一次解析服务时执行一些检查。

不过,Simple Injector 确实提供了两个 API 来获取有关其注册的文本信息。

您可以使用 Analyzer 来获取有关验证结果的结构化信息,而不是调用 Verify()。这将包括关于您的图形的诊断信息(即提示),不会导致 Verify 抛出。例如,可以将以下测试添加到您的测试套件中:

[TestMethod]
public void Container_Never_ContainsDiagnosticWarnings() {
    // Arrange
    var container = Bootstrapper.GetInitializedContainer();

    container.Verify(VerificationOption.VerifyOnly);

    // Assert
    var results = Analyzer.Analyze(container);

    Assert.IsFalse(results.Any(), Environment.NewLine +
        string.Join(Environment.NewLine,
            from result in results
            select result.Description));
}

有关此的详细信息,请参阅 documentation about Diagnostics

Simple Injector 还允许通过构建对象图的类 C# 字符串表示来可视化对象图。这可以通过调用 InstanceProducer.VisualizeObjectGraph() 来完成。 InstanceProducer 可以通过调用 Container.GetRegistration()Container.GetRegistration(Type) 获得。这是一个例子:

var container = new Container();

container.Register<Foo>();
container.Register<IBar, Bar>();
container.Register<ILogger, FileLogger>(Lifestyle.Singleton);
container.Register<IDependency1, Dependency1>();
container.Register<IDependency2, Dependency2>();

// You need to verify to get the correct output of those methods
container.Verify();

var r = container.GetRegistration(typeof(Foo));

Console.WriteLine(r.VisualizeObjectGraph());

这可能会导致以下输出:

Foo(
    FileLogger(
        Dependency1(),
        Dependency2()),
    Bar(
        Dependency1(),
        SomeService()));