热门标签 | 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 ... [详细]
  • 优化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. ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • Python 异步编程:深入理解 asyncio 库(上)
    本文介绍了 Python 3.4 版本引入的标准库 asyncio,该库为异步 IO 提供了强大的支持。我们将探讨为什么需要 asyncio,以及它如何简化并发编程的复杂性,并详细介绍其核心概念和使用方法。 ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • 本文介绍了如何在C#中启动一个应用程序,并通过枚举窗口来获取其主窗口句柄。当使用Process类启动程序时,我们通常只能获得进程的句柄,而主窗口句柄可能为0。因此,我们需要使用API函数和回调机制来准确获取主窗口句柄。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
  • 本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
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社区 版权所有