RegisterWithContext和LifestyleMismatch我想在我的控制器中注入一个记录器,我需要将扩展??信息传递给记录器的构造函数。为此,我使用了RegisterWithContext:作为依赖注入。”);}returnnewCommon.Logging.NLogLogger(context.ImplementationType.FullName);});RegisterWithContext扩展方法显式地将提供的委托注册为Transient。我需要在恰好是单例的服务中注入相同的Logger(Common.Logging.NLogLogger)。在升级到SimpleInjector3.0.6之前,一切似乎都按预期工作,并且container.Verify()对整个配置非常满意。升级后,验证器返回一些错误:[LifestyleMismatch]SearchEngineIndexerService(Singleton)dependsonILogger(Transient)。[生活方式不匹配]MembershipService(Web请求)依赖于ILogger(瞬态)。这是有道理的。我能理解为什么会发生这种情况以及为什么应该避免这种情况。我试图避免“我登录太多”综合症,但实际上,我确实需要登录某些服务。我已经尝试使用RegisterConditional根据某些条件注册不同的记录器,但是,当然,所有记录器现在都应该有条件地注册,否则我会得到这个异常:ILogger类型已经注册为无条件注册。对于非泛型类型,条件注册和无条件注册不能混用。将记录器注册为控制器的瞬态和另一个用于单例服务的最佳方法是什么?您现在看到此异常的原因是因为v3.0.6修复了一些错误,这些错误阻止了生活方式不匹配警告在某些情况下出现。最好忽略RegisterWithContext扩展方法,因为它已被v3中的RegisterConditional方法取代。但是,RegisterConditional只允许注册类型;不是委托,因为委托允许您根据运行时决策做出决策,但在对象图解析期间做出运行时决策是不好的做法。因此,最好定义一个代理记录器类,允许将调用转发给真正的记录器。例如:publicsealedclassLogger:ILogger{privatestaticreadonlyILoggerlogger=newCommon.Logging.NLogLogger(typeof(T).FullName);//在这里实现ILogger方法voidILogger.Log(stringmessage){//委托给真正的记录器logger.Log(message);这个实现可以按如下方式注册:文档对此进行了更详细的描述。以上就是C#学习教程:RegisterWithContext与LifestyleMismatch分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: