我正在设计一个可重用的类库,其中包含名为core.xml.dll和core.string.dll的2个程序集(包括其他程序)。
xml程序集引用字符串程序集以使用某些字符串帮助程序方法。
但是现在有一个字符串方法可以从使用xml程序集中包含的方法中受益。
如果我从字符串程序集引用xml程序集,我将创建一个循环依赖项,并且无法从源代码构建这两个程序集。 (即鸡肉和鸡蛋问题)。
为了遵循“不要重复自己”的原则,我希望避免重复两个程序集中的功能。如果我在实现中发现了一个错误,我只想在一个地方修复它。
虽然我可以将组件合并为一个,但这并不理想,因为它会降低组件的内聚性。
我需要重新构建并重新部署整个程序集,只是为了对特定类进行小的更改。最后,由于存在如此多的依赖关系,我可能最终会得到一个巨大的库组件。
因此,在可重用的库集合集的上下文中,这里使用的最佳方法是什么?另外,.NET框架本身如何处理这个问题?
(在Reflector中,似乎System.Configuration.dll引用System.XML.DLL,反之亦然。这实际上是否正确,如果是这样,循环依赖如何管理?)
答案 0 :(得分:6)
同意Knives。循环依赖是一种设计气味。无情地重构它!
在业务对象紧密耦合的情况下,这可能具有挑战性。在大多数情况下,这可以通过依赖注入来解决。
伪C ++示例:
class Employee {
Company company;
};
class Company {
vector<Employee> employees;
};
棘手?不是必须的:
template<class CompanyT>
class Employee {
CompanyT company;
};
class Company {
vector<Employee<Company> > employees;
};
更多原始类型,必须依赖于更高级别,可以抽象为适用于任何其他类型,只要它履行合同。
答案 1 :(得分:3)
听起来你需要第三次组装......
答案 2 :(得分:3)
使其成为xml程序集中定义的扩展方法(基于您的注释“接受XML并转换为基于字符串的格式的转换方法”)。它正在处理xml。就像Linq为IEnumerable做的那样。
答案 3 :(得分:3)
如果您的String库确实需要您的XML库,那么可能表明您的String库需要重构为较低级别的数据类型定义和“核心实用程序”(如果可能,没有外部依赖项),另一个可以引入XML,SQL,正则表达式或其他在应用程序层中有用的其他高级库。