避免循環依賴


在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

}

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM