软件设计问题:循环依赖

时间:2009-08-03 16:20:55

标签: c#

我遇到了一个小小的设计问题。

以下情况

图书馆界面

包含每个模型类的接口(仅限getter和setter)

Libray Businnes Logic

包含接口库和DAL的实现。 使用界面&运输车库

图书馆转运: 包含用于消息传递第三方Web服务的类。如果需要,我还想添加第三方库的引用或Web引用。 使用接口库。

到目前为止太好了。现在没有循环依赖。只要需要调用Web服务,业务逻辑库就会使用“transporter”库来调用extern方法。这非常有效。

但现在我需要创建一个Web服务,第三方应该能够在我们这边创建业务对象。我想创建一个“转换库”,其中bussines对象转换为外部webservies的消息对象,反之亦然。我认为这是我当前架构的问题。如果我想创建这个库,我会得到循环依赖。 原因是

  • 转运转移引用转换
  • 转换库引用BL
  • BL引用Transporter

我希望我能够很好地解释我的情况。

感谢您解决这个问题的每一个想法。

3 个答案:

答案 0 :(得分:8)

Dependency injection救援:

  1. 创建ITransporter界面 它提供的服务模型 “输送”。把它放在接口库中。让Transporter实施ITransporter
  2. 在您的商务图书馆,程序 针对ITransporter界面 而不是直接使用 Transporter。现在的业务 库不需要依赖 运输车库了。
  3. 在您的应用程序/ Web服务中 把所有东西粘在一起的地方 创建Transporter的实例 并将其注入您需要的地方 您商家中的ITransporter个对象 码。

答案 1 :(得分:1)

您可以重新考虑您的设计。将所有第三方Web服务组合到一个DLL中,然后将可能被视为基本功能(转换)的内容移动到另一个库中是否有意义?我认为为每个Web服务(或服务组,如果有意义将它们分组)创建具有适当功能的单个程序集会更有意义。

假设“每个项目中都不需要[转]功能”,你也有一些错误的逻辑。如果是这种情况,为什么业务逻辑程序集依赖于它?

答案 2 :(得分:0)

我会将转换代码放在transporter库中。转换是特定于服务的,并且不需要将它们与传输分开。您可能希望使用命名空间来分隔不同的服务及其转换。我还考虑不将所有服务放入单个库中。如果将它们放在一个库中,你将失去以细粒度方式引用它们的能力 - 它是全部或全部。

相关问题