再次约log4net的和Unity IOC配置(again about log4net and Un

2019-07-03 13:16发布

我已经通过了其中的一些问题,各地不同地点铺设颠簸了一下,答案似乎是由L4N officianados向着轻量化的包装,log4net的“是”的值纺(你明白吗?)和心灵的相似点-boggling事实。

不过似乎有什么用户所要求的(这是我的问题)是如何适应log4net的客体模型转换的流畅配置界面registertype / registerinstance序列。

这里的目标将不会被重新包装L4N,而仅仅是为了抓住一个像样的参考,这并不”需要劫持的流畅流,因为它是。

ejemplow差,我想从一个LogManger.GetLogger方法的ILog的一个配置实例的引用,并把它放入一口流利的流量足够早将其注入到我的下游对象的属性。

因此,在应对一个不耐烦的建议,我试图在规范的方式创建的ILog的正常实例:

log4net.Config.XmlConfigurator.Configure();
static readonly log4Net.Ilog Log = LogManager.GetLogger(thatlongassemblyreflectionstuff);

因此,这将是微不足道的(在毫不费力的真正意义上)现在引用添加到统一容器中,用我的美好的生活。

但是,对于RegisterInstance方法签名想要一个“类型”不是一个接口。

对于那些谁没有通过log4net的对象模型搜索时,afficiananderos是正确的:L4N是“包装”,你不能得到日志的thingie实际的“类型”的霍尔特。

所以,现在我来测试一下。 你知道这意味着什么,这可能需要一分钟,但更可能需要一个小时或四(像“小时”和“四”的拼写similarilties是从来没有在现实生活中的巧合)。

但是,下面,减去约规范设置消隐部分,做过的工作:

container
  .RegisterInstance("Logger", Log, new ContainerControlledLifetimeManager())
.RegisterType<IControllerContext, ControllerContext>
(
   "CtlrCtx", 
   new ContainerControlledLifetimeManager(), 
   new InjectionConstructor(new ResolvedParameter<IMessageBuilder>("MsgBldr")),
   new InjectionProperty("Log",new ResolvedParameter<ILog>("Logger"))
);

所以,注入我的marvy小上下文对象的属性为原单日志对象和Log对象的哈希码是相同的。

然而...

注射过程中要求我通过它的接口暴露Context对象的Log属性,这意味着它可能不再是一个静态的对象。 而无论是log4net的ILog的对象是静态的,似乎是决定性的因素是否是序列化和可组件之间mashalled没有戏剧性的“运行时将变得不稳定的警告(这是真正有意义的只有矩阵风扇)。

劝阻,但没有阻止,我用ReSharper的漂亮的“财产与支持字段”并将支持字段是静态的,而界面特性住非静态的。 那么它建成并试跑了绿色。

所以我甚至重建和它的工作。 所以,也许当这冒泡的集成测试,我会潜行过去log4net的不是序列化的崩溃。

因此,也许这将帮助

谢谢

状态

Answer 1:

将使用统一2帮助InjectionFactory? (见这个问题 )。 那么你的配置代码会是这个样子:

IUnityContainer container = new UnityContainer();
container.RegisterType<ILog>(new InjectionFactory(factory => LogManager.GetLogger()));

然后您检索与通常的通话记录器来解决():

ILog logger = container.Resolve<ILog>();
logger.Log(Level.Debug, "Hello world");

您可能还能够配置记录器的寿命是ContainerControllerLifetimeManager为好,使之成为单一实例,但我并不确认这一点呢。



Answer 2:

ILog logger = container.Resolve<ILog>();
logger.Log(Level.Debug, "Hello world");

确实工作。

但是,如果你有一个类中的日志记录器的属性,并希望这种记录器实例注入到它,这是行不通的AFAICT。 我想我可能会偏离目标,但我想重用记录器实例在一个新的环境。 这可能仅仅是可撤销的,所以我可能要放弃注入它,只是添加行

ILog logger = container.Resolve<ILog>();

每一个类,这给了我这个结果似乎只比在每一个类实例化它略有不同....

我希望,

private ILog Logger {get;set;} 

可能只是被注入,但似乎并没有在所有的工作,因为所有通过log4net的一切都是通过接口完成,具体记录器是隐藏与绿野仙踪帘子后面。



文章来源: again about log4net and Unity IOC config