2012-05-10 41 views
1

我正在建立一個GUI模式(一個項目)和一個控制檯模式(另一個項目)的.NET解決方案。這些項目中的每一個都引用一個共享類庫,該類庫在每個應用程序後面都保存着共享的邏輯內容我希望DLL儘可能與每個客戶端應用程序隔離開來。我怎樣才能讓gui的DLL報告進度?現在,GUI項目引用了DLL。 VS2010/.NET不會讓我從DLL中引用GUI,因爲它將是一個循環引用。有一個DLL報告回主表格

我該怎麼做?如何在.NET設計或一般軟件設計中處理這些問題,是否有任何一般原則?有沒有一種方法來使用回調,而無需引用調用項目?

+3

聽起來像是你需要在你的DLL中的自定義事件,可以在你的GUI項目進行定義。 –

+0

但我怎麼能在沒有參考的情況下在ddl中從GUI中引發自定義事件? – bernie2436

+0

dll代碼定義了一個事件並在某個時刻執行該事件。它不知道什麼是註冊的事件。 gui定義了要分配給事件處理函數的函數。 –

回答

1

像你需要在你的DLL中的自定義事件,您則附加到它的聲音,我的GUI。

下面是一些代碼,使其更容易理解。

首先,讓我們創建我們的DLL的模擬,做類似的東西來裝,也決定了我們可以在我們的圖形用戶界面,收到的完成百分比附加到事件:

public class MyDLLType 
{ 
    public decimal PercentageComplete = 5; 

    public event EventHandler<CustomEventArgs> StatusChanged; 

    public virtual void OnStatusChanged(CustomEventArgs e) 
    { 
    if(StatusChanged != null) 
    { 
     StatusChanged(this, e); 
    } 
    } 

    public void DoSomething() 
    { 

    var eventArgs = new CustomEventArgs(); 
    eventArgs.PercentageComplete = PercentageComplete; 

    OnStatusChanged(eventArgs); 

    if(PercentageComplete < 100) 
    { 
     Thread.Sleep(500); 
     PercentageComplete++; 
     DoSomething(); 
    } 
    } 
} 

現在我們有一個模擬DLL爲我們的GUI公開了一個StatusChanged事件。這裏有一個模擬GUI利用這一點:

public class MyGUI 
{ 
void Main() 
{ 
    var myNiceDLLType = new MyDLLType(); 
    myNiceDLLType.StatusChanged += UpdateStatusChange; 
    myNiceDLLType.DoSomething(); 
} 

public void UpdateStatusChange(object sender, CustomEventArgs e) 
{ 
var percentageComplete = e.PercentageComplete; 
Console.WriteLine(percentageComplete); 
} 
} 

和賓果遊戲,我們的GUI是接收從DLL完成百分比,而不需要DLL瞭解的GUI任何東西。

我上面使用的CustomEventArgs看起來是這樣的:

public class CustomEventArgs : EventArgs 
{ 
    public decimal PercentageComplete{get;set;} 
} 
0

如果設計是這樣的,它需要循環引用,恕我直言,你應該重新設計那部分代碼在必要的地方。

我建議把培訓相關的代碼codereview.stackexchange.com

1

打破循環引用最簡單的方法是創建另一個庫,兩個模塊的參考。

另一種選擇是使用可以通過邏輯DLL被提出,並在GUI /控制檯部分處理的事件

相關問題