热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#学习教程:与ninject的循环依赖分享

与ninject的循环依赖我试图弄清楚如何用ninject绑定这样的东西的正确方法。interfaceIMainService{voidDoStuff();}interfaceIO

与ninject的循环依赖

我试图弄清楚如何用ninject绑定这样的东西的正确方法。

interface IMainService { void DoStuff(); } interface IOtherService { void DoSomeMagic(); } abstract class BaseClass { //many stuff here } class MainClass : BaseClass, IMainService { public MainClass(IOtherService s) { } public void DoStuff() { throw new NotImplementedException(); } //do many other things } class OtherClass : IOtherService { public OtherClass(IMainService s) { } public void DoSomeMagic() { throw new NotImplementedException(); } } class BaseModule : NinjectModule { public override void Load() { Bind().To(); Bind().To(); Bind().To(); } } static class Program { static void Main() { var kernel = new StandardKernel(new BaseModule()); var main = kernel.Get(); } } 

它给了我例外:

 Error activating IOtherService using binding from IOtherService to OtherClass A cyclical dependency was detected between the constructors of two services. Activation path: 4) Injection of dependency IOtherService into parameter s of constructor of type MainClass 3) Injection of dependency IMainService into parameter s of constructor of type OtherClass 2) Injection of dependency IOtherService into parameter s of constructor of type MainClass 1) Request for MainClass Suggestions: 1) Ensure that you have not declared a dependency for IOtherService on any implementations of the service. 2) Consider combining the services into a single one to remove the cycle. 3) Use property injection instead of constructor injection, and implement IInitializable if you need initialization logic to be run after property values have been injected. 

我不知道怎么写BaseModule。 我只需要一个MainClass实例和一个OtherClass实例(如单例)。

我尝试过这样的事情:

 Bind().To().InSingletonScope(); Bind().To().InRequestScope(); Bind().To().InSingletonScope(); 

但是同样的错误。

如何为MainClass和IMainService接口只使用一个实例编写绑定?

谢谢你的回答。

正如错误消息所示,您在MainClassOtherClass之间MainClass循环依赖关系,因为您无法在没有另一个实例的情况下创建一个。 理想情况下,您应该重新构建类层次结构以删除此要求。

如果不能,解决方案是对一个(或两个)类使用属性注入,例如

 public interface IMainService { void DoStuff(); IOtherService OtherService { set; } } public class MainClass { public IOtherService OtherService { get; set; } public void DoStuff() { ... } } public class OtherService { public OtherService(IMainService main) { main.OtherService = this; } } 

我认为你不应该使用属性或setter方法,你最好使用Lazyness。 懒惰的概念解决了这个问题。 问题是,如果对象之间存在循环依赖关系,则不清楚要创建第一个对象。 懒惰解析是:一旦真正使用了对象(通常在调用公共方法时就是这种情况,它需要存在)。 如果可能的话,请避免使用属性或设置器。 它们使您的对象变得可变(对于线程安全性不好,并且在依赖项应该只注入一次时不需要)。

您的构造函数应如下所示:

 public OtherService(Lazy main) { this.main = main; } public MainClass(Lazy s) { this.s = s; } 

您可以使用Load方法通过调用“ToMethod(”基于get方法创建Lazy方法的lambda方法)在Ninject模块中描述这些延迟依赖项。

这里给出了一个关于惰性如何解决与Ninject的循环依赖关系的明显例子。 它还描述了一个帮助方法(BindLazy)来解决您的问题。 https://www.codeproject.com/Tips/1171940/How-Ninject-Can-Help-in-Resolving-Circular-Depende

上述就是C#学习教程:与ninject的循环依赖分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—编程笔记


推荐阅读
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • Java 中 Writer flush()方法,示例 ... [详细]
  • 本文介绍了如何使用 Spring Boot DevTools 实现应用程序在开发过程中自动重启。这一特性显著提高了开发效率,特别是在集成开发环境(IDE)中工作时,能够提供快速的反馈循环。默认情况下,DevTools 会监控类路径上的文件变化,并根据需要触发应用重启。 ... [详细]
  • Java 中的 BigDecimal pow()方法,示例 ... [详细]
  • Java 类成员初始化顺序与数组创建
    本文探讨了Java中类成员的初始化顺序、静态引入、可变参数以及finalize方法的应用。通过具体的代码示例,详细解释了这些概念及其在实际编程中的使用。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 将Web服务部署到Tomcat
    本文介绍了如何在JDeveloper 12c中创建一个Java项目,并将其打包为Web服务,然后部署到Tomcat服务器。内容涵盖从项目创建、编写Web服务代码、配置相关XML文件到最终的本地部署和验证。 ... [详细]
author-avatar
郭建将_683
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有