C# 反映注射目标
我在各种项目中发现的一个非常常见的日志记录目标是,创建日志条目的任何类/对象都将在该条目中记录自己的类/对象名称。如果日志项用于异常和堆栈跟踪,则该信息将免费包含。但是,如果日志条目不是针对异常,则通常使用多种其他方法来获得此结果:C# 反映注射目标,c#,dependency-injection,unity-container,ioc-container,C#,Dependency Injection,Unity Container,Ioc Container,我在各种项目中发现的一个非常常见的日志记录目标是,创建日志条目的任何类/对象都将在该条目中记录自己的类/对象名称。如果日志项用于异常和堆栈跟踪,则该信息将免费包含。但是,如果日志条目不是针对异常,则通常使用多种其他方法来获得此结果: 将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,即使基于上下文的注册也可以非常快地解决
但请注意,基于上下文的注入通常是一种设计味道。事实上,您在字段中随处可见这种模式,这并不意味着它是正确的。因此,在继续之前,请确保