求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
  
 
 
 
程序集(UML中的包)之间循环依赖问题及其解决方案
 

2010-07-19 作者:shiyulun1984 来源:shiyulun1984的blog

 

不知道大家有没有在实际中碰到过程序集之间的元素循环依赖的问题,例如:A.dll 中的类A 引用到了 B.dll中的类B,B.dll中的类B又引用到了程序A.dll中的类A。如果存在这种情况,除非两个程序集(.net 中dll就是一个程序集)均编译通过,否则一个程序集出现错误就会导致另一个程序集也编译不通过,于是让这个编译错误就会循环传递,使得编译器告诉我们:两个程序集不能编译通过。(如图1)

图1 AssemblyA 与AssemblyB之间的依赖关系

不过现在visual studio 已经在你添加引用的时候自动告诉检测到这种坏味道,拒绝这种操作(能想到的都想到了,微软的IDE确实很强大:-))。

由于IDE拒绝我们这种做法,但是在AssemblyA中的类型引用了AssemblyB中类型的情况下,AssemblyB中的类型又想引用AssemblyA中的类型(因为当前设计的限制,必须这样引用才能实现所需功能)怎么办呢?似乎将两个AssemblyA和AssemblyB合并为一个大的AssemblyAB可以解除掉这种循环依赖的关系,但是仔细想想,这样做会在很大程度上影响到已经分别引用到两个程序集的客户代码(别的程序集或者客户代码)。

下面提供了两种解决方案来解除这种循环依赖关系:

1.将产生依赖的类型分离出来,放到另一个新的程序集AssemblyC中去。

2.使用接口来解除循环依赖:

这种方式的具体做法(如图2):

2.1. 从被依赖的类中,提取出一个接口放到新的程序集中(接口中的成员是依赖类中所依赖的,当然被依赖的类是实现了该接口的)。

2.2 依赖类去引用2.1中新建的程序集中的新接口。

图2 使用接口解除两个程序集的循环依赖关系