.net - 循环依赖与 DRY

标签 .net dry circular-dependency

我正在设计一个可重用的类库,其中包含 2 个名为 core.xml.dll 和 core.string.dll 的程序集(其中包括)。

xml 程序集引用字符串程序集,以便使用一些字符串辅助方法。

但是,现在有一个字符串方法可以从使用 xml 程序集中包含的方法中受益。

如果我从字符串程序集引用 xml 程序集,我将创建一个循环依赖项,并且将无法从源代码构建这两个程序集。 (即鸡和蛋的问题)。

为了遵循“不要重复自己”的原则,我想避免在两个程序集中重复功能。如果我在实现中发现错误,我只想在一个地方修复它。

虽然我可以将程序集合并为一个,但这并不理想,因为它会降低程序集的凝聚力。

我需要重新构建和重新部署整个程序集,只是为了对特定类进行小改动。此外,最终,由于依赖关系如此之多,我最终可能会得到一个巨大的库程序集。

那么在一组可重用的库程序集的上下文中,在这里使用的最佳方法是什么?另外,.NET 框架本身是如何处理这个问题的?

(在 Reflector 中,System.Configuration.dll 似乎引用了 System.XML.DLL,反之亦然。这实际上是否正确,如果是这样,如何管理循环依赖关系?)

最佳答案

同意刀。循环依赖是一种设计气味。无情地重构它!

在业务对象紧密耦合的情况下,这可能具有挑战性。在大多数情况下,这可以通过依赖注入(inject)来解决。

伪 C++ 示例:

class Employee {
    Company company;
};

class Company {
    vector<Employee> employees;
};

棘手?不一定:
template<class CompanyT>
class Employee {
    CompanyT company;
};

class Company {
    vector<Employee<Company> > employees;
};

必须依赖更高级别的更原始类型可以抽象为与任何其他类型一起使用,只要它履行其契约(Contract)即可。

关于.net - 循环依赖与 DRY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/623006/

相关文章:

c# - 从数据表中删除重复条目的最佳方法

css - 使用 SASS 干燥多个 3 列列表

c++ - 在不牺牲效率的情况下保持代码干燥

angular - 检测到循环依赖项中的警告 - Angular Cli

.net - 查找用户网络服务的临时文件夹?

.net - ListBox.DisplayMember = [String] 我可以以某种方式解决它而不是 .NET 中的字符串吗?

C# 根据多个值过滤 excel 列

ruby-on-rails - 嵌套(同时未嵌套)资源更好的方法

c++ - 打破shared_ptr和unique_ptr之间的循环依赖

具有测试范围的maven循环依赖