2012-08-31 91 views
7

現在我正在編寫一個應用程序,並且認爲現在我所做的工作必須有更好的解決方案。c#類間通信的最佳方式

我有一個主窗口,它將處理程序的設置。然後我有更多的課程和窗口。例如,一個語言處理程序類和一個處理「main函數」所需的用戶輸入的表單。

但是,直到現在,我總是必須將主窗口傳遞給每個類,因爲語言處理程序應該能夠更改主窗口的字符串。另一種形式也應該能夠將數據傳遞到主窗口。

如果我們想象會有更多的類,每個類需要一個主窗口的副本,根據主窗口的「大小」,這會消耗大量資源。

那麼,有沒有更好/更有效的方式來溝通這些類。

+3

閱讀[引用類型與值類型](http://www.albahari.com/valuevsreftypes.aspx)並且不要擔心傳遞主表單,因爲它是一個參考類型。 –

+0

Thx給大家。哇,我應該知道它是作爲參考傳遞的。但我會看看你的所有建議;) –

回答

9

通常的做法是使用observer pattern,它在.NET中是events system。簡而言之,您的課程會訂閱彼此的事件並在事件發生時執行操作。正如註釋中所指出的那樣,傳遞引用不是內存繁重,但它會導致不同代碼段之間的緊密耦合 - 觀察者模式解決了這個問題。

2

我建議你使用GalasoftPrism MVVM實現。在那裏你可以使用他們的消息服務,這是很容易使用。需要信息的類只是向用戶發送一條消息,他們又可以發送所有需要的數據。我認爲這是處理溝通的最簡單方法。

2

除了伊萬給出的答..如果我們看一個較高的水平視圖,而無需所有這些術語,那麼你可能需要創建一個靜態類,這將服務器作爲InMemoryStorage並定義它的字段保存信息
這你將完全控制正在共享的內容,並且多個組件可以更改它
此外,您可以定義getter和setter,並在屬性發生更改時引發事件,以便不同的窗體或窗口(視圖)可以訂閱該更改並且採取相應措施

3

另一種選擇是將您的課程視爲服務。將它們編碼到一個接口,然後使用dependency injection(aka Inversion of Control)來構建對象圖(您告訴IoC容器您想要一個frmSomething,它將確定它需要哪些服務/類並酌情實例化它們)。

這意味着:

  • 你永遠只需要編寫針對接口而不是實現
  • 你的代碼是鬆散耦合(您可以爲NewTranslator交換的OldTranslator只要它們都遵守到相同的接口,除了容器的配置以外不需要改變任何東西)
  • 您可以開發依賴於尚未編寫的服務的高級功能,並且您的代碼將編譯爲
  • 您通過更改容器中註冊的類/服務,可以非常容易地在需要時運行時更改應用程序的工作方式。

查看支持MS的DI容器的UnityCastle Windsor是一個流行的選擇,但還有更多

值得注意的是,傳遞一個主窗口的「副本」,正如你所說的並不是一件壞事 - 你只是在傳遞一個引用指針)添加到主窗口(因爲比真實圖元更復雜的是參考類型)。這意味着幾乎沒有任何開銷

相關問題