2009-12-03 70 views
0

我的問題:在應用程序內部,所有接口都是在自己的dll(例如項目「接口」)中聲明的。接口DLL中的類實現?

項目接口內部也有很多類實現。

現在我需要在另一個項目中實現這些類中的一個,並獲得環形依賴項,因爲此項目也是項目接口中的參考。

那麼,解決這個環依賴的最好方法是什麼?有可能這是應用程序設計中的一個重大錯誤嗎?

示意圖:

IBigInterface.cs(一切都在一個文件中):

interface ISomeInterfaceA 
{ 
    void SomeFunctionA(ClassB x); // ClassB from newProject.cs 
    void SomeFunctionB(); 
} 

// 
// etc. 
// 
class ClassA 
{ 
    // 
    // Code 
    // 
} 
(在一個文件中的所有內容)

newProject.cs:

class ClassB 
{ 
    // 
    // used in interfaces.dll 
    // 
} 

class ClassC 
{ 
    void SomeFunction(ClassA a) // ClassA from IBigInterface.cs 
    { 
     // 
     // do something 
     // 
    } 
} 

即進入第一件事我的想法是。像:

IBigInterface.cs:

interface ISomeInterfaceA 
{ 
    void SomeFunctionA(IInterfaceB x); // use interface instead of a class 
    void SomeFunctionB(); 
} 

interface IInterfaceB 
{ 
    // 
    // declarations 
    // 
} 

class ClassA 
{ 
    // 
    // implementation 
    // 
} 

newProject.cs:

class ClassB : IInterfaceB // implementation of IInterfaceB 
{ 
} 

class ClassC 
{ 
    void SomeFunction(ClassA a) 
    { 
     // 
     // implementation 
     // 
    } 
} 

使項目newProject不會在項目界面參考了(儘管這意味着在整個變化應用)。

P.S .:我繼承了這個應用程序,所以在接口項目中實現類的想法不是我的想法:)。 一般來說,我會爲每個類創建一個文件(所以不要指向這:)。

回答

6

首先,將具體類和它們實現的接口組合到一個程序集中是沒有問題的(儘管調用項目「接口」會有點奇怪)。

話雖如此,循環引用通常表示您已將代碼過度模塊化:引起循環引用的部分屬於一起,它們應合併到一個程序集中。

其他時候,循環引用只是一個類在錯誤層的標誌;該課程需要完全轉移到另一個程序集中(通常從較低級別的基礎結構程序集到更高級別的程序集中)。例如,ClassC可能真的屬於引用「interfaces」程序集的另一個項目。

+0

「引起循環引用的部分屬於一起」 - 我同意你的一般意見,但也可能是因爲屬於頂層的組件被置於底層。我有不幸接管這樣的代碼:(花了我幾天的時間來修復,並將組件移動到正確的層次上。 – Pete 2009-12-03 14:25:42

+0

@Pete - true!更新我的答案。 – 2009-12-03 14:57:02

1

這就是爲什麼Java 需要公共定義在自己的文件(但我認爲你在這裏得到的概念:))。

混合純粹的接口和實現通常並不好(雖然有些情況下它可能會有用),如果將它們導出爲DLL,它肯定是一個麻煩製造者。

循環依賴意味着您的項目過於耦合而不同。這通常是不良設計的症狀(如big ball of mud -like)。你應該去除那個耦合或者把兩個項目合併在一起。

1

如果您有一個特定的項目,如您所說,它包含您的所有界面,爲什麼不引入另一個包含「幫助類」的項目,如ClassA?然後你的接口DLL和依賴於接口DLL的項目可以使用這些類。

0

我會嘗試將幾個項目通用的類和接口分解成一個「Common」程序集(或類似的),它對引用它的程序集沒有依賴關係。

例如,如Product商業實體不必知道它是如何堅持通過Web服務數據庫或取出任何東西,但服務組件事情Product,例如IProductsRepository,需要知道什麼是Product。因此,其中IProductsRepository定義的程序集(或名稱空間)擁有對程序集(或名稱空間)的引用,其中Product存在於其中,但不是其他方式。