6

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

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

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

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

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

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

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

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

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

4

4 回答 4

6

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

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

伪 C++ 示例:

class Employee {
    Company company;
};

class Company {
    vector<Employee> employees;
};

棘手?不一定:

template<class CompanyT>
class Employee {
    CompanyT company;
};

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

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

于 2009-03-08T04:15:48.513 回答
3

听起来你需要第三次组装......

于 2009-03-08T04:06:49.673 回答
3

使其成为在 xml 程序集中定义的扩展方法(基于您的注释“接受 XML 并转换为基于字符串的格式的转换方法”)。它正在处理xml。就像 Linq 对 IEnumerable 所做的一样。

于 2009-03-08T04:18:08.587 回答
3

如果您的 String 库确实需要您的 XML 库,这可能表明您的 String 库需要重构为较低级别的数据类型定义和“核心实用程序”(如果可能,没有外部依赖项),以及另一个更高级别的库,它可能会引入 XML、SQL、正则表达式或您认为在应用层有用的任何其他内容。

于 2009-03-08T04:18:24.157 回答