热门标签 | 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#学习教程,希望大家多多关注—编程笔记


推荐阅读
  • 探讨ChatGPT在法律和版权方面的潜在风险及影响,分析其作为内容创造工具的合法性和合规性。 ... [详细]
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • 并发编程 12—— 任务取消与关闭 之 shutdownNow 的局限性
    Java并发编程实践目录并发编程01——ThreadLocal并发编程02——ConcurrentHashMap并发编程03——阻塞队列和生产者-消费者模式并发编程04——闭锁Co ... [详细]
  • 深入解析 Android IPC 中的 Messenger 机制
    本文详细介绍了 Android 中基于消息传递的进程间通信(IPC)机制——Messenger。通过实例和源码分析,帮助开发者更好地理解和使用这一高效的通信工具。 ... [详细]
  • 本文介绍了如何在多线程环境中实现异步任务的事务控制,确保任务执行的一致性和可靠性。通过使用计数器和异常标记字段,系统能够准确判断所有异步线程的执行结果,并根据结果决定是否回滚或提交事务。 ... [详细]
  • JSOI2010 蔬菜庆典:树结构中的无限大权值问题
    本文探讨了 JSOI2010 的蔬菜庆典问题,主要关注如何处理非根非叶子节点的无限大权值情况。通过分析根节点及其子树的特性,提出了有效的解决方案,并详细解释了算法的实现过程。 ... [详细]
  • 本文详细探讨了 org.apache.hadoop.ha.HAServiceTarget 类中的 checkFencingConfigured 方法,包括其功能、应用场景及代码示例。通过实际代码片段,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 题目描述:给定一个N*M的网格,初始时网格中有k个芯片,每个芯片的位置已知。玩家可以在每一步操作中将所有芯片沿同一方向移动一格。如果芯片到达边界,则保持不动。目标是通过一系列操作,使每个芯片依次访问指定的目标位置。 ... [详细]
  • 本文介绍如何在Spring Boot项目中集成Redis,并通过具体案例展示其配置和使用方法。包括添加依赖、配置连接信息、自定义序列化方式以及实现仓储接口。 ... [详细]
  • 本文详细探讨了Android Activity中View的绘制流程和动画机制,包括Activity的生命周期、View的测量、布局和绘制过程以及动画对View的影响。通过实验验证,澄清了一些常见的误解,并提供了代码示例和执行结果。 ... [详细]
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • CSS高级技巧:动态高亮当前页面导航
    本文介绍了如何使用CSS实现网站导航栏中当前页面的高亮显示,提升用户体验。通过为每个页面的body元素添加特定ID,并结合导航项的类名,可以轻松实现这一功能。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
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社区 版权所有