如何解决循环引用?

2023-12-13

如何解决循环引用问题,例如 A 类将 B 类作为其属性之一,而 B 类将 A 类作为其属性之一?

架构师该如何解决这类问题呢?

如果以NHibernate为例,对象之间就会存在父子关系。

它如何处理这些父子场景?


在大多数情况下,当我必须让两个事物相互引用时,我创建了一个接口来删除循环引用。例如:

BEFORE

public class Foo
{
    Bar myBar;
}

public class Bar
{
    Foo myFoo;
}

依赖关系图:

Foo     Bar
 ^       ^
 |       |
Bar     Foo

Foo 依赖于 Bar,但 Bar 也依赖于 Foo。如果它们位于单独的程序集中,您将在构建时遇到问题,特别是在进行全新重建时。

AFTER

public interface IBar
{
}

public class Foo
{
    IBar myBar;
}

public class Bar : IBar
{
    Foo myFoo;
}

依赖关系图:

Foo, IBar     IBar
    ^          ^
    |          |
   Bar        Foo

Foo 和 Bar 都依赖于 IBar。不存在循环依赖,如果 IBar 放置在其自己的程序集中,则 Foo 和 Bar 位于单独的程序集中将不再是问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何解决循环引用? 的相关文章

  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • 重载<<的返回值

    include
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 全局变量和Python多重处理[重复]

    这个问题在这里已经有答案了 可能的重复 Python 多处理全局变量更新未返回到父级 我使用的是一台具有多个内核的计算机 为了提高性能 我真的应该使用多个内核 但是 我很困惑为什么这些代码没有达到我的预期 from multiprocess
  • 字符串中的 JavaScript var

    所以我有这段代码 想知道如何将我的 javascript var 放入这个字符串中 我似乎无法为自己编写工作代码 对于我想要的图像源picture value在那里 我尝试过不同的解决方案 但自己没能解决 非常感谢所有帮助 var text
  • 将多个“滑块”添加到同一个图表

    我正在使用 R 编程语言 使用 plotly 库 我能够制作以下交互式图表 library dplyr library ggplot2 library shiny library plotly library htmltools libra
  • 为什么上传alamofire后台请求不在后台执行?

    我使用 alamofire 将 30 mb zip 文件上传到服务器 这是我的要求 let configuration URLSessionConfiguration background withIdentifier identifire
  • 搜索和替换操作

    我有一个包含 URL 值的列表 例如 http farm6 static flickr com 5149 5684108566 aed8b9b52d s jpg 我怎样才能改变 s最后到 m对于所有发生的情况 尝试这个 str http f
  • Apache交叉编译错误./gen_test_char:无法执行二进制文件

    我花了很长时间才找到这个错误的解决方案 当尝试为 Arm 交叉编译 Apache 时 我确信这可能发生在许多其他架构上 我会从服务器文件夹中得到这个错误 gen test char cannot execute binary file 这意
  • @ngtools\webpack AOT 不起作用或在 95% 发射时冻结

    我一直在尝试让 AOT 与我的 Webpack 应用程序一起工作 ngtools webpack 有人能帮我吗 它似乎可以工作 但是 compiler js 仍然包含在捆绑包中 此外 它仍在寻找我的所有 html 文件 并在所有组件模板上获
  • C的隐藏特性

    Locked 这个问题及其答案是locked因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 我知道所有 C 编译器实现背后都有一个标准 因此不应该有任何隐藏功能 尽管如此 我确信所有 C 开发人员都有他们一直使用的隐藏 秘
  • 从 Python 中调用命名空间获取本地变量

    我想从被调用函数中检索 Python 的局部变量 有什么办法可以做到这一点吗 我意识到这对于大多数编程来说并不合适 但我基本上是在构建一个调试器 例如 def show locals put something in here that s
  • 在事件循环中共享队列

    是否可以在一个事件循环中的不同任务上共享 asyncio Queue 用例 两项任务正在队列上发布数据 一项任务正在从队列中获取新项目 所有任务都以异步方式进行 main py import asyncio import creator a
  • android numberpicker索引出界旋转

    我正在尝试创建一个自定义时间选择器 但遇到的问题是当我旋转屏幕时 另外 如果我按主页按钮离开应用程序 当我返回时出现相同的错误时 它会崩溃 public class MyTimePicker extends RelativeLayout p
  • 如何让执行 PHP 脚本的 Cronjob 运行时间超过 30 秒?

    我如何将其重写为每天运行超过 30 秒的 cron 另外 我需要编辑 htaccess or php ini文件在cron php目录说些什么 在浏览器上 它可以正常运行 30 秒以上 在外壳上 它也运行得很好 但作为一个 cron 设置的
  • 如何在 Eclipse 中使用引用的项目

    好吧 也许每个人都知道如何做到这一点 但我从来没有尝试过 因为我从来没有需要它 所以 你如何在 Eclipse 中处理多个引用的项目 我有几个 Struts 1 Web 应用程序 它们必须使用另一个 struts 1 库 项目 现在我正在使
  • 如何排除 Maven 插件中的依赖关系?

    我有一个项目需要以下 Maven jibx 插件
  • 在另一个 JNI 函数中使用时 Oop 被损坏

    问题是我们可以缓存吗jclass and jmethodID跨不同的 JNI 方法调用 当尝试使用缓存创建某个特定类的对象时 我遇到了一些奇怪的行为jclass and jmethodID来自另一个 JNI 方法调用 这是一个简单的例子 p
  • 在哪里可以找到一个好的 JavaScript/HTML AutoSuggest 示例 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我正在寻找 JavaScr
  • 从派生类访问基类中的类型别名[重复]

    这个问题在这里已经有答案了 当尝试从派生类访问基类中的类型别名时 我面临以下问题 template
  • WebView动态插入/修改内容

    在我的应用程序中 我使用 WebView 来显示内容 现在是否可以动态修改内容 需求是这样的 我将从网络获取信息 并根据它们我需要设置样式 字体 属性 或者当连接的设备没有响应时我可能需要附加新文本 到目前为止我正在使用以下代码 void
  • Java webstart max-heap-size导致JVM无法启动

    我们在客户端使用 java web start 来构建基于 java swing 的应用程序 最近 当单击 jnlp 链接时 我们遇到了一个奇怪的 无法启动 java 虚拟机 错误 我们很快就发现了这一点 因为 jnlp 文件中的 max
  • 如何解决循环引用?

    如何解决循环引用问题 例如 A 类将 B 类作为其属性之一 而 B 类将 A 类作为其属性之一 架构师该如何解决这类问题呢 如果以NHibernate为例 对象之间就会存在父子关系 它如何处理这些父子场景 在大多数情况下 当我必须让两个事物