软件设计问题:循环依赖
我遇到了一个小小的设计问题。
以下情况
库接口
包含每个模型类的接口(仅限getter和setter)
Libray Businnes Logic
包含接口库和DAL的实现。 使用接口和传输器库
Library Transporter :包含用于消息传递第三方Web服务的类。 此外,我想在需要时添加第三方库的引用或Web引用。 使用接口库。
到目前为止太好了。 现在没有循环依赖。 只要需要调用Web服务,业务逻辑库就会使用“transporter”库来调用extern方法。 这非常有效。
但现在我需要创建一个Web服务,第三方应该能够在我们这边创建业务对象。 我想创建一个“转换库”,其中bussines对象转换为外部webservies的消息对象,反之亦然。 我认为这是我当前架构的问题。 如果我想创建这个库,我会得到循环依赖。 原因是
- 转运蛋白引用变换
- 转换库引用BL
- BL引用转运蛋白
我希望我能很好地解释我的情况。
感谢您解决这个问题的每一个想法。
dependency injection救援:
- 创建一个
ITransporter
接口,为“Transporter”提供的服务建模。 把它放在接口库中。 让Transporter
实现ITransporter
。 - 在您的业务库中,针对
ITransporter
接口进行编程,而不是直接使用Transporter
。 现在,业务库不再需要依赖于传输程序库。 - 在将所有内容粘合在一起的应用程序/ Web服务中,创建一个
Transporter
实例,并将其注入业务代码中需要ITransporter
对象的位置。
您可以重新考虑您的设计。 将所有第三方Web服务分组到一个DLL中,然后将可能被视为必要function(转换)的内容移动到另一个库中是否有意义? 我认为为每个具有适当function的Web服务(或服务组,如果有意义将其分组)创建单独的程序集会更有意义。
假设“每个项目中都不需要[转]function”,你也有一些错误的逻辑。 如果是这种情况,为什么业务逻辑程序集依赖于它?
我会将转换代码放在transporter库中。 转换是特定于服务的,并且不需要将它们与传输分开。 您可能希望使用命名空间来分隔不同的服务及其转换。 我还考虑不将所有服务放入单个库中。 如果将它们放在一个库中,你将失去以细粒度方式引用它们的能力 – 它是全部或全部。