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

与ninject共享

时间:2023-04-11 03:30:09 C#

循环依赖与ninject的循环依赖我正在尝试找出如何使用ninject绑定此类内容的正确方法。接口IMainService{voidDoStuff();}interfaceIOtherService{voidDoSomeMagic();}abstractclassBaseClass{//这里有很多东西}classMainClass:BaseClass,IMainService{publicMainClass(IOtherServices){}publicvoidDoStuff(){thrownewNotImplementedException();}//做很多其他的事情}}classBaseModule:NinjectModule{publicoverridevoidLoad(){Bind().To();绑定到();绑定到();}}staticclassProgram{staticvoidMain(){varkernel=newStandardKernel(newBaseModule());varmain=kernel.Get();}}它给了我一个例子:ErroractivatingIOtherServiceusingbindingfromIOtherServicetoOtherClass在两个服务的构造函数之间检测到循环依赖性。激活路径:4)在MainClass类型构造函数的参数s中注入依赖IOtherService3)I将依赖项IMainService注入到类型为OtherClass的构造函数的参数中2)将依赖项IOtherService注入到类型为MainClass的构造函数的参数中1)请求MainClass建议:1)确保您尚未声明IOtherService对服务的任何实现的依赖项。2)考虑将服务合并为一个服务以消除循环。3)使用属性注入而不是构造函数注入,如果需要在注入属性值后运行初始化逻辑,则实现IInitializable。我不知道如何编写BaseModule我只需要一个MainClass实例和一个OtherClass实例(就像一个单例)。我试过这样的事情:Bind().To().InSingletonScope();Bind().To().InRequestScope();Bind().To().InSingletonScope();但同样的错误。如何编写绑定以仅对MainClass和IMainService接口使用一个实例?谢谢您的回答。正如错误消息所说,您在MainClass和OtherClass之间存在对MainClass的循环依赖,因为您不能在没有另一个实例的情况下创建一个。理想情况下,您应该重构您的类层次结构以消除此要求。如果不能,解决方案是在一个(或两个)类上使用属性注入,例如公共接口IMainService{voidDoStuff();IOtherServiceOtherService{设置;}}publicclassMainClass{publicIOtherServiceOtherService{get;放;}publicvoidDoStuff(){...}}publicclassOtherService{publicOtherService(IMainServicemain){main.OtherService=this;我不认为你应该使用属性或setter方法,你最好使用Lazyness。懒惰的概念解决了这个问题。问题在于,如果对象之间存在循环依赖,则不清楚哪个对象先创建。惰性解析是:一旦对象被实际使用(通常是调用公共方法时,它就需要存在)。尽可能避免使用属性或设置器。它们使您的对象可变(不利于线程安全,并且在只应注入一次依赖项时不需要)。您的构造函数应如下所示:publicOtherService(Lazymain){this.main=main;}publicMainClass(Lazys){this.s=s;您可以通过调用“ToMethod(”基于get方法创建Lambda方法的Lazy方法)来使用Load方法来描述Ninject模块中的这些惰性依赖项。此处给出了惰性如何解决Ninject循环依赖的一个明显示例。它还描述了一种帮助程序方法(BindLazy)来解决您的问题。https://www.codeproject.com/Tips/1171940/How-Ninject-Can-Help-in-Resolving-Circular-Depende以上是C#学习教程:ninject循环依赖分享的所有内容,如果有帮助对大家有用,需要了解更多C#学习教程,希望大家多多关注—本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: