循环依赖解决方案

时间:2010-04-07 22:54:19

标签: c# .net design-patterns architecture circular-dependency

我们当前的项目遇到了循环依赖问题。我们的业务逻辑程序集使用SharedLibrary程序集中的类和静态方法。 SharedLibrary包含一大堆辅助函数,例如SQL Reader类,枚举器,全局变量,错误处理,日志记录和验证。

SharedLibrary需要访问Business对象,但Business对象需要访问SharedLibrary。旧的开发人员通过复制共享库中的业务对象的功能(非常反DRY)来解决这种明显的代码味道。我花了一天时间试图阅读我的选择来解决这个问题,但我已经走到了尽头。

我对架构重新设计的想法持开放态度,但仅作为最后的手段。那么如何才能拥有一个可以访问业务对象的共享助手库,业务对象仍然可以访问共享助手库?

3 个答案:

答案 0 :(得分:20)

您只能为值对象(无逻辑)和接口创建单独项目。

让您的共享库类实现接口,并且业务库依赖于接口(我在这里听到更多可测试和解耦的代码吗?更不用说从共享库中删除依赖项了) 。

理想情况下,您可以拥有共享库依赖于此额外项目的业务对象。如果业务对象太复杂,您也可以将它们转换为接口。

您将使两个项目彼此不相互依赖,但仅限于仅具有“虚拟”对象的其他项目(无逻辑):

商业--->接口和值对象< ---共享库

现在这些已经解耦了=)

答案 1 :(得分:3)

任何时候你有一个“共享”库,你绝对不能引用你的业务实体项目。这样做会导致这个问题发生,因为你明显看到了。

解决方法是从共享库中删除所有与业务实体相关的代码,并重新解析对该帮助程序代码的需求,或将该帮助程序代码放在业务实体项目本身中。

答案 2 :(得分:1)

一种解决方案是在两者之间放置一个立面图案。在这里,您将避免从共享库直接访问/依赖您的业务对象。相反,您将使用一个层作为lib和BO之间的外观。这样,您可以打包和分离共享库。