C# 反映注射目标

C# 反映注射目标,c#,dependency-injection,unity-container,ioc-container,C#,Dependency Injection,Unity Container,Ioc Container,我在各种项目中发现的一个非常常见的日志记录目标是,创建日志条目的任何类/对象都将在该条目中记录自己的类/对象名称。如果日志项用于异常和堆栈跟踪,则该信息将免费包含。但是,如果日志条目不是针对异常,则通常使用多种其他方法来获得此结果: 将const字段硬编码到每个类中,其中包含类的名称(或记录器本身!)。日志记录器在记录时被赋予该常量 记录器用反映调用堆栈的代码包装,以确定哪个类进行了日志调用。然后将该名称添加到日志条目中 每个类都注入了一个记录器实例,该实例已经知道注入它的类的名称 #3的一个简

我在各种项目中发现的一个非常常见的日志记录目标是,创建日志条目的任何类/对象都将在该条目中记录自己的类/对象名称。如果日志项用于异常和堆栈跟踪,则该信息将免费包含。但是,如果日志条目不是针对异常,则通常使用多种其他方法来获得此结果:

  • 将const字段硬编码到每个类中,其中包含类的名称(或记录器本身!)。日志记录器在记录时被赋予该常量
  • 记录器用反映调用堆栈的代码包装,以确定哪个类进行了日志调用。然后将该名称添加到日志条目中
  • 每个类都注入了一个记录器实例,该实例已经知道注入它的类的名称
  • #3的一个简单示例如下所示:

    ILogger logger = new MyLogger("AmazingClass");
    IAmazingClass foo = new AmazingClass(logger);
    
    var container = new UnityContainer();
    container.RegisterType<ILogger, MyLogger>(new InjectionFactory(
        (Type targetOfInjection) => new MyLogger(targetOfInjection.Name)
    );
    
    我想知道的是,国际奥委会的任何容器,特别是Unity,是否能够优雅地帮助解决这个“场景3”?如果是,如何进行

    我觉得答案应该很简单:IOC容器“知道”它将要构造和注入哪个类,并在完成类型解析之前将“dependor”信息提供给“dependee”

    例如,也许Unity可以通过如下“反向反射”注册来实现这一点:

    ILogger logger = new MyLogger("AmazingClass");
    IAmazingClass foo = new AmazingClass(logger);
    
    var container = new UnityContainer();
    container.RegisterType<ILogger, MyLogger>(new InjectionFactory(
        (Type targetOfInjection) => new MyLogger(targetOfInjection.Name)
    );
    
    var container=newunitycontainer();
    container.RegisterType(新注入工厂(
    (键入targetOfInjection)=>新建MyLogger(targetOfInjection.Name)
    );
    
    我编造了这个语法,但它是完全可信的。也就是说,Unity(或另一个IOC容器)为提议的功能提供了什么

    p、 我个人对我的记录器和日志记录“没问题”,没有尝试捕获非异常条目的类/对象名称。使代码更简单。但如果我被迫这样做,我通常会选择堆栈反射选项(场景2)。当需要在非异常日志记录语句中捕获类名时,了解人们喜欢的其他方法会很有趣。不过,最终,这个问题集中在使用IOC容器上

    也就是说,Unity(或另一个国际奥委会容器)实际上提供了什么 建议的能力

    我无法回答Unity的问题,但使用,您可以注册如下:

    container.RegisterWithContext(context=>
    新的MyLogger(context.ImplementationType.Name));
    
    您需要使用Simple Injector文档中的扩展方法添加
    RegisterWithContext
    扩展方法。最大的优点是,使用Simple Injector,即使基于上下文的注册也可以非常快地解决

    但请注意,基于上下文的注入通常是一种设计味道。事实上,您在字段中随处可见这种模式,这并不意味着它是正确的。因此,在继续之前,请确保

    也就是说,Unity(或另一个国际奥委会容器)实际上提供了什么 建议的能力

    我无法回答Unity的问题,但使用,您可以注册如下:

    container.RegisterWithContext(context=>
    新的MyLogger(context.ImplementationType.Name));
    
    您需要使用Simple Injector文档中的扩展方法添加
    RegisterWithContext
    扩展方法。最大的优点是,使用Simple Injector,即使基于上下文的注册也可以非常快地解决

    但请注意,基于上下文的注入通常是一种设计味道。事实上,您在字段中随处可见这种模式,这并不意味着它是正确的。因此,在继续之前,请确保