当前位置: 首页 > 编程语言 > C#

使用Ninject共享填充Log4Net依赖性

时间:2023-04-11 02:47:23 C#

使用Ninject填充Log4Net依赖性我在我的应用程序中使用Ninject作为DI容器。为了松散地耦合到我的日志记录库,我使用了这样的接口:publicinterfaceILogger{voidDebug(stringmessage);无效调试(字符串消息,异常异常);无效调试(异常异常);无效信息(字符串消息);...你明白了我的实现看起来像这个publicclassLog4NetLogger:ILogger{privateILog_log;公共Log4NetLogger(ILog日志){_log=日志;}publicvoidDebug(stringmessage){_log.Debug(message);}...等等具有日志记录依赖性的示例类publicpartialclassHomeController{privateILogger_logger;公共HomeController(ILogger记录器){_logger=记录器;实例化Log4Net实例时,您应该为其提供要记录的类的名称。这对Ninject来说是一个挑战。目标是当HomeController被实例化时,Ninject应该用“HomeController”的“名称”实例化ILog这是我的配置GetLogger(GetParentTypeName(x))).InSingletonScope();绑定().To().InSingletonScope();}privatestringGetParentTypeName(IContextcontext){returncontext.Request.ParentContext.Request.ParentContext.Request.Service.FullName;但是,传递给ILog的“名称”并不是我所期望的。我也想不出任何韵律或理由,有时是真的,大多数时候不是。我看到的名称属于也依赖于ILogger的其他类。Ninject.Extension.Logging扩展已经提供了您可以自己实现的所有功能。包括对log4net、NLog和NLog2的支持。https://github.com/ninject/ninject.extensions.logging你还想使用以下作为你的记录器类型:context.Request.ParentRequest.ParentRequest.Target.Member.DeclaringType否则你会得到一个服务类型的记录器比实现类型。我个人对抽象出我的记录器没有兴趣,所以我的实现模块直接引用log4net.dll,并且我的构造函数根据需要调用ILog。为了实现这一点,使用Ninjectv3的单行注册在我的staticvoidRegisterServices(IKernelkernel)的末尾看起来像这样:kernel.Bind().ToMethod(context=>LogManager.GetLogger(context.Request.Target.Member.反射类型));内核.Get();}classLogCanary{publicLogCanary(ILoglog){log.Debug("DebugLoggingCanarymessage");log.Info("记录Canary消息");对于诊断日志记录问题,我在开始时遇到以下问题以获取非DI驱动的消息:");应用程序产生以下结果:INFOMeApp.App_Start.NinjectWebCommon-StartDEBUGMeApp.App_Start.NinjectWebCommon+LogCanary-DebugLoggingCanarymessageINFOMeApp.App_Start.NinjectWebCommon+LogCanary-LoggingCanarymessageILog和ILogger的范围需要是瞬态的,否则它只会重用它创建的第一个记录器。感谢@MerylnMorgan-Graham帮我找到它。Bind().ToMethod(x=>LogManager.GetLogger(GetParentTypeName(x))).InSingletonScope();您当前在Singleton范围内绑定,因此只创建一个将使用第一个创建的记录器的记录器。而是使用InTransientScope()对于仍在寻找正确答案的每个人来说,正确的实现是:.Member.DeclaringType));绑定().To().InSingletonScope();重点是:x.Request.Target.Member.DeclaringType也许我的回答晚了,但我使用的是这种格式:privatestaticvoidRegisterServices(IKernelkernel){kernel.Bind().ToMethod(c=>LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType)).InSingletonScope();我喜欢将Log4Net包装在我自己的界面想法中。我不想依赖Ninjects实现,因为对我来说这只是意味着我在整个应用程序中依赖Ninject,我认为这与依赖注入完全相反。从第三方服务中解放出来。所以我采用了原始海报的代码,但我更改了以下代码以使其工作。私有字符串GetParentTypeName(IContext上下文){varres=context.Request.ParentRequest.ParentRequest.Service.FullName;返回res.ToString();我必须调用ParentRequest.ParentRequest,这样当我打印布局%logger时,它将打印调用Log4Net日志方法的类,而不是调用Log方法的Log4Net类。以上就是C#学习教程:使用Ninject填写Log4Net依赖共享的所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处: