gpt4 book ai didi

c# - 项目之间的循环软依赖被认为是一个好的设计吗?

转载 作者:行者123 更新时间:2023-11-30 16:15:36 25 4
gpt4 key购买 nike

考虑一个基于组件的系统,其中组件使用彼此的功能并且可能具有软循环依赖性。这里的“软依赖”是指依赖组件将使用另一个可用的服务,但在没有另一个组件的情况下仍然可以运行属性。系统中也存在硬依赖,当一个组件没有另一个组件就无法运行时,但它们不是循环的。这是一种好的设计还是应该避免循环依赖,即使它们是软的?

这个问题是由于 C# 不允许项目在项目之间具有循环依赖关系而我使用项目来隔离系统中的组件这一事实引起的。然后它们被编译成程序集,其中的一个子集由应用程序根据配置动态加载。

附言如果您将此问题标记为没有建设性,请添加评论建议一个网站,我可以在该网站上提出设计问题,这些问题并不总是有一个单一的客观答案并且需要一些讨论。

更新:请求的软依赖示例:客户端管理器组件需要使用位置组件的服务,以告知客户端对象的位置(这是硬依赖,因为客户端必须知道对象的位置)。然而,位置组件也希望使用客户端管理器组件的接口(interface)来扩展客户端的 API 并允许它们也设置位置(这是软依赖),因为如果当前实例的客户端管理器组件可能不存在于系统中服务器不需要与客户端对话。

最佳答案

根据您在更新中提供的示例,我会用static(而不是hard)和dynamic来表达您的需求(而不是)依赖。

如果 ClientImpl 静态使用 LocationImplLocationImpl 动态使用 ClientImpl 我不会认为这是设计问题(通过 ClientInterface)。 ClientImpl 甚至可以通过将 ClientInterface 作为参数的 LocationImpl 方法将自身注入(inject)到 LocationImpl 中。这构成了一个相当广泛采用的面向对象模式(称之为 Injection of ControlDependency Injection 背后的理念是相同的,看看 Martin Fowler wrote about it 差不多十年前是什么)。

顺便说一句,所有这些都意味着 ClientImpl 的级别高于 LocationImpl,而 itslef 的级别高于 ClientInterface

当设计文档将循环依赖关系称为主要设计问题时,它通常指的是静态/硬依赖关系。

这个问题是由于 C# 不允许项目在项目之间具有循环依赖关系而我使用项目来隔离系统中的组件这一事实引起的。

确实,因为如果两个程序集相互引用的可能性非常高,就会创建静态/硬依赖关系。 MS 一直将程序集视为实现组件概念的 .NET 方式,因此,VS 防止了组件之间的循环依赖。


有趣的是,.NET Framework 设计带有几个循环程序集依赖项!

enter image description here

enter image description here

关于c# - 项目之间的循环软依赖被认为是一个好的设计吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19381688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com