LightInjectIoC容器在解析类型时抛出stackoverflow在尝试LightInjectIoC容器http://www.lightinject.net/时,在解析ISomeService时抛出stackoverflowexception:所有类型都在App_Start中注册:container.RegisterAssembly("MyApp*.dll");然后,当我尝试在控制器中解决它时,它失败并出现stackoverflowexception:publicSomeController(ISomeServicesomeService){_someService=someService;我在使用ServiceLocator时遇到同样的错误:ServiceLocator.Current.GetInstance();我跟踪了它,我可以看到它在LightInjectServiceContainer类中失败了,但我不明白为什么它会失败。publicobjectGetInstance(TypeserviceType){returnGetDefaultDelegate(serviceType,true)(constants.Items);}调用GetDefaultDelegate后,执行路径再次结束于GetInstance,造成死循环和栈溢出。编辑2-进一步追踪这个问题,它似乎是由SomeService同时具有构造函数和属性注入引起的:publicclassSomeService:ISomeService{publicIAnotherServiceAnotherService{get;放;}publicSomeService(IAnotherServiceanotherService){AnotherService=anotherService;取决于IAnotherServiceAnotherService是通过构造函数和属性注入的,但无意使用属性注入器。编辑3应用程序中有几层使用ServiceLocator,所以我最初使用NuGet将LI添加到我自己的项目中,所以我有:MyApp.IoC.LightInjectMyApp.RepositoriesMyApp.ServicesMyApp.Web.UI但实际上并不真的需要将它添加到自己的项目中,因为服务定位器提供者可以在UI层中设置:varserviceLocator=newLightInjectServiceLocator(container);ServiceLocator.SetLocatorProvider(()=>serviceLocator);所以我只是删除了额外的项目,并将NuGet包放入UI层。我还安装了LightInject.Annotation并故意不调用container.EnableAnnotatedPropertyInjection()方法以确保仅使用构造函数注入。它仍然在抛出stackoverflow。为了测试解析是否有效,我只是在HomeController.Index()方法中执行此操作:publicActionResultIndex(){vara=ServiceLocator.Current.GetInstance();我在ServiceController.GetInstance方法日志记录中添加了一些控制台,以便我可以看到导致stackoverflow的方法调用流程。这是日志,结果有点出乎意料。您可以看到,当它为ISomeService调用CreateDelegate()时,它最终会尝试首先获取HomeController的实例–为什么会这样?Key=''GetInstance:ISomeServiceTryGetValue:ISomeServicenotfoundTryAddValue:尝试立即添加ISomeServiceCreateDynamicMethodDelegate:ISomeServiceCreateDynamicMethodDelegate:为ISomeServiceDoGetInstance:HomeController调用CreateDelegate()。Key=''GetInstance:HomeControllerTryGetValue:找不到HomeControllerTryAddValue:现在尝试添加HomeControllerCreateDynamicMethodDelegate:HomeControllerCreateDynamicMethodDelegate:为HomeControllerDoGetInstance调用CreateDelegate():ISomeService。Key=''GetInstance:ISomeServiceTryGetValue:ISomeServicenotfoundTryAddValue:尝试立即添加ISomeServiceCreateDynamicMethodDelegate:ISomeServiceCreateDynamicMethodDelegate:为ISomeServiceDoGetInstance:HomeController调用CreateDelegate()。Key=''GetInstance:HomeControllerTryGetValue:HomeContr找不到ollerTryAddValue:现在尝试添加HomeControllerKey=''GetInstance:ISomeServiceTryGetValue:ISomeServicenotfoundTryAddValue:尝试立即添加ISomeServiceCreateDynamicMethodDelegate:ISomeServiceCreateDynamicMethodDelegate:为ISomeServiceDoGetInstance:HomeController调用CreateDelegate()。Key=''GetInstance:HomeControllerTryGetValue:找不到HomeControllerTryAddValue:现在尝试添加HomeControllerCreateDynamicMethodDelegate:HomeControllerCreateDynamicMethodDelegate:为HomeControllerDoGetInstance调用CreateDelegate():ISomeService。Key=''GetInstance:ISomeServiceTryGetValue:ISomeServicenotfoundTryAddValue:现在尝试添加ISomeServiceCreateDynamicMethodDelegate:ISomeServiceCreateDynamicMethodDelegate:为ISomeServic调用CreateDelegate()e当我注释掉服务的构造函数时,解析有效并且所有依赖项都通过属性注入解析如果包含构造函数,则它会抛出StackOverflowException。虽然解析ISomeService仅在使用属性时有效,但如果该服务在其依赖项中包含ISomeService,则无法解析IAnotherService。我希望上面的日志能说明问题。到目前为止,LightInject的性能明显优于Unity作为LightInject的作者,我将尝试回答。首先,LightInject永远不应抛出StackOverflowException,因此需要根据您在此处描述的内容进行调查。我很清楚属性注入不是您想要的,因为两次注入服务(构造函数和属性)没有意义。实际上,我们可以做几件事来避免对属性的依赖注入。通过删除publicsetter将属性设置为只读。使用文档中所谓的“显式”服务注册来注册服务。container.Register(f=>newSomeService(f.GetInstance()));这将导致公共属性被忽略,因为我们现在对如何解决SomeService类的依赖关系有了清晰的认识。使用LightInject.Annotation这将确保只有标有InjectAttribute的属性才会注入其依赖项。在您的特定情况下,这意味着只将属性保留为没有属性的属性。我们可以通过组合根中的这个简单配置来实现这一点。container.EnableAnnotatedPropertyInjection();如前所述,我将进一步调查StackOverflowException并对这种情况进行适当的调整。我的第一个想法是,如果容器发现有资格作为构造函数依赖项和属性依赖项注入的依赖项,则抛出异常。希望这可以帮助。最好的问候BernhardRichter编辑虽然问题似乎已经解决,但我仍然希望能够在测试中重现该问题。获取异常的原因可能并不像具有构造函数依赖和相同类型的属性依赖的服务那么简单。考虑这个服务publicclassFooWithConstructorAndPropertyDependency:IFoo{publicFooWithConstructorAndPropertyDependency(IBarbar){}公共IBar酒吧{得到;放;}}LightInject会愉快地注入依赖项。容器.Register();容器.Register();容器.GetInstance();所以必须有其他原因导致异常。如果您能想出一个最小的例子来重现异常以便处理它,我将不胜感激。没有失败的东西我很难进一步调查:)如果你选择做这个努力,你可以在这里张贴它或发送电子邮件至bernhard.richter@gmail.com。以上就是C#学习教程:LightInjectIoC容器在解析类型时抛出所有stackoverflow共享的内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文来自网络收藏,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
