在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
}