2013-03-13 58 views
0

我有一個'App'類,它有一個'DeviceManager'類和一個窗體'MainForm'存儲爲字段的實例。 單擊系統托盤圖標可以看到MainForm。 DeviceManager具有Docked和Undocked方法,其中Docked開始同步操作。如果MainForm不可見,Docked方法只應該啓動操作。檢查一個C#屬性而不參考它的類?

DeviceManager無法訪問應用程序的成員,所以它不能使用應用程序對MainForm的引用來檢查表單的狀態。當DeviceManager沒有其他需要這樣的引用(MainForm和DeviceManager因此彼此不知道)時,將App傳遞給DeviceManager的構造函數看起來像很多耦合。

我正在考慮讓App.IsUserActive屬性的setter引發一個DeviceManager可以用來維護其自己的「IsUserActive」字段的事件。

有沒有其他方法可以研究?

編輯:添加代碼來說明:

internal class App 
{ 
    private DeviceManager _deviceMgr; 
    private MainForm _mainForm; 

    internal App() 
    { 
     _deviceMgr = new DeviceManager(); 
     _mainForm = new MainForm { Visible = false }; 
    } 
} 

internal class DeviceManager 
{ 
    private void Docked() 
    { 
     if (!_mainForm.Visible) //can't see MainForm or App from here 
     { 
      Connect(); 
      StartSynchronization(); 
     } 
    } 

    private void Undocked() 
    { 
     Disconnect(); 
    } 
} 
+4

如果您*顯示*代表性代碼而不是*描述*它會更容易理解您的問題。 – 2013-03-13 14:47:13

+0

聽起來不錯。你也可以創建另一個類,它們都提供了用於存儲數據的引用,但是這在許多方面都是緊密耦合的。 – Hogan 2013-03-13 14:48:05

回答

0

有一個全球性的參考,你可以使用的形式。 這裏有一個簡單的例子:

//Inside of DeviceManager class 
private bool CheckFormVisibility<TForm>() where TForm : Form 
{ 
    TForm form = System.Windows.Forms.Application.OpenForms.OfType<TForm>().SingleOrDefault(); 
    return form != null && form.Visible; 
} 

然後調用CheckFormVisibility<MyForm>()或刪除仿製藥,並專門爲您MyForm使用。

**我在這裏假設你只有零/一個窗體實例。

+0

API知識的好答案。但是,從設計的角度來看,使用全局(如此)和強耦合類沒有區別。事實上,我認爲這會更糟糕,因爲你不容易看到正在使用的課程,並且可能很容易引入迴歸錯誤。基於OQ事件的模型更容易維護,恕我直言 – Hogan 2013-03-13 16:10:55