软件设计问题:循环依赖

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

以下情况

库接口

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

Libray Businnes Logic

包含接口库和DAL的实现。 使用接口和传输器库

Library Transporter :包含用于消息传递第三方Web服务的类。 此外,我想在需要时添加第三方库的引用或Web引用。 使用接口库。

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

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

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

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

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

dependency injection救援:

  1. 创建一个ITransporter接口,为“Transporter”提供的服务建模。 把它放在接口库中。 让Transporter实现ITransporter
  2. 在您的业务库中,针对ITransporter接口进行编程,而不是直接使用Transporter 。 现在,业务库不再需要依赖于传输程序库。
  3. 在将所有内容粘合在一起的应用程序/ Web服务中,创建一个Transporter实例,并将其注入业务代码中需要ITransporter对象的位置。

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

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

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