设置简单注射器的记录仪

时间:2018-06-20 14:36:50

标签: .net simple-injector

我已将我的应用程序设置为使用public MyClass(IInterface sender) { this.sender = sender; } 作为DI容器,我已经注册了所有存储库/服务,并且我希望建立最新的步骤:将简单Simple Injector记录为在自己的业务中输出。

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

1 个答案:

答案 0 :(得分:11)

简单注入器在内部根本不记录任何内容。 。这是一个非常明确的设计决策,因为Simple Injector的API并非专门通过防止任何错误的日志系统报告警告和错误,而专门设计用于防止错误,并且在检测到诸如歧义之类的问题时会抛出异常。 / p>

传达问题的异常分为多个阶段。首先,在注册过程中检查各种条件和约束。其次,在调用.Verify()时,Simple Injector会检查它是否可以构建所有注册的类型,并进行所有类型的分析以验证对象图是否合理构造。作为最后的选择,如果未调用Verify,则在首次解析服务时会执行一些检查。

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

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

[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()来完成。可以通过调用InstanceProducerContainer.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()));