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