弹指一挥间

好好做事,学习待人 (大数据分析/.NET/JAVA)技术交流QQ:860280456; .NET/JAVA技术交流群:192028174

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
在2个项目中相互引用工程会提示 将导致循环依赖,如果相互引用的dll可以暂时规避,但日后改成引用工程则会仍报错,解决办法如下:
using System;

namespace ConsoleAppPreventCircularDependency
{
class Program
{
static void Main(string[] args)
{
//A a = new A();
//a.MethodA();
////System.StackOverflowException

AA aa=new AA();
aa.MethodAA();
}
}

/*
* 双向耦合在同一个项目下,只是设计问题;
* 在不同项目中,必须解耦,否则项目之间互相引用会提示 将导致循环依赖项
*
* 一般来说,不应该存在双向耦合,有此情况则应考虑重构
*/

#region 解耦前的代码

class A
{
private B b;

public void MethodA()
{
Console.WriteLine("MethodA 已调用!");
b = new B();
b.MethodB();//“System.StackOverflowException”类型的未经处理的异常在 mscorlib.dll 中发生
}
}

class B
{
private A a;

public void MethodB()
{
Console.WriteLine("MethodB 已调用!");
//请在循环调用的某个地方,添加相关中止语句,否则会报错 栈溢出
a = new A();
a.MethodA();
}
}

#endregion

#region 解耦后的代码

/*
* AA,BB分别在2个不同的项目中,提炼一个接口,放置在一个新起的项目中,
* 然后AA,BB所在的项目引用该接口所在的项目。
*/

interface ISample
{
void MethodAA();
}

class AA : ISample
{
private BB bb;
public void MethodAA()
{
Console.WriteLine("MethodAA 已调用!");
bb = new BB();
bb.MethodBB();//“System.StackOverflowException”类型的未经处理的异常在 mscorlib.dll 中发生
}
}

class BB
{
private ISample aa;

public void MethodBB()
{
Console.WriteLine("MethodBB 已调用!");
//请在循环调用的某个地方,添加相关中止语句,否则会报错 栈溢出
aa = new AA();
aa.MethodAA();
}
}

#endregion

}

 
 
posted on 2014-03-23 10:33  v.e.n.u.s  阅读(2977)  评论(4编辑  收藏  举报