2009-08-03 57 views
1

我坚持一点设计问题。软件设计问题:循环依赖

以下情况

库接口

包含接口为每个模型类(getter和仅设置器)

Libray Businnes逻辑

包含接口库和DAL的实现。 使用接口&转运库

库转运: 包含类短信第三方Web服务。此外,如果需要,我想添加第三方库的引用或Web引用。 使用接口库。

到目前为止不错。现在没有循环依赖。只要需要调用web服务,业务逻辑库就会使用“transporter”库调用extern方法。这工作得很好。

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

  • 转运引用变换
  • 转换库引用BL
  • BL引用转运

我希望我可以解释我的情况很好。

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

回答

8

Dependency injection救援:

  1. 创建ITransporter接口 该款机型的服务受到 “玩命” 提供。把它放在接口库中。使Transporter执行ITransporter
  2. 在您的商业图书馆,程序 针对ITransporter接口 而不是直接使用 Transporter。现在,商业 库不再需要依赖 传输库。
  3. 在您的应用程序/ Web服务 ,你把所有的东西在一起, 创造Transporter 实例,并在那里你在你的业务 代码需要一个 ITransporter对象注入它。
+0

+1为正确的大锤。然而,通过重新思考模块化,仍然可能不太有力的解决方案。 – 2009-08-03 16:35:59

1

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

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

+0

嗯这是一个好主意,不要为每个第三方Web服务创建单个库。 你的梦想是真实的,我的假设是错误的。每个项目中都需要传输功能*,但未使用*。它仅用于特殊情况。我会纠正我的问题。 – nWorx 2009-08-03 16:39:29

0

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

+0

我试过了,但是我需要一个来自传输的参考 - > bl和bl - >传输,再次是循环依赖 我不知道如何在转换中创建有效的业务对象(命名空间或库) – nWorx 2009-08-03 16:35:53