2008-09-08 50 views
2

首先,有我的博客上提供一點背景的這個問題:消息傳遞的插件框架

我知道,描述不是非常清楚,所以我會盡力總結我在這裏盡力而爲的嘗試。該應用程序是一個個人財務計劃。關於框架本身的進一步背景可以在這篇文章的末尾找到。

框架可以處理多種不同類型的插件(例如帳戶,導出,報告等)。但是,我關注的是一個特定的插件類,即所謂的數據插件,因爲這是導致我遇到問題的類。我有一類數據插件的賬戶,一個用於交易等

我中途已經給我留下了下面的架構數據插件廣闊的再保:

  • 數據插件對象(實現intialisation,安裝和插入式元數據)[器具IDataPlugin<FactoryType>]
  • 的數據對象(例如,賬戶)[器具,例如,IAccount]
  • 甲工廠創建實例的數據對象[實現,例如,IAccountFactory]

此前數據對象和插件對象合併爲一個,但這意味着必須爲帳戶中記錄的每個事務實例化新的事務插件,這會導致一些問題。不幸的是,這種重新分解破壞了我的信息傳遞。數據對象實現了INotifyPropertyChanged,所以我遇到了一個新問題,並且我不確定如何解決這個問題:插件對象正在向消息代理註冊事件,但它實際上是數據對象事件。這意味着訂閱插件目前必須訂閱每個創建的帳戶,交易等!這顯然不可擴展。

至於我當時可以告訴我有兩個可能的解決方案:

  1. 使數據插件對象的穿針引線的數據對象和消息代理,可能分批更改通知。我不喜歡這樣,因爲它給消息傳遞系統增加了另一層複雜性,我覺得我應該可以不做。
  2. 垃圾當前基於事件的實現並使用其他更容易管理的內存(內存中的WCF ?!)。

所以我想我真的問:

  1. 你會如何解決這個問題?
  2. 您認爲我忽視了哪些潛在解決方案?
  3. 我的方法甚至隱約地在軌道上/明智的?!:-)

從博客文章的日期可以看出,這個問題的一些變體現在已經徵稅了相當長的一段時間!因此,任何和所有的答覆將不勝感激。

的背景框架本身如下:

我的插件框架由三個主要部分組成:一個插件經紀人,一個偏好管理器和消息代理。插件代理執行面包和黃油插件:發現和創建插件。偏好管理器管理框架和各個插件的用戶偏好,例如啓用了哪些插件,數據應該保存在哪裏等。通信是通過發佈/訂閱,消息代理坐在中間,收集所有發佈的消息類型和管理訂閱。發佈/訂閱目前通過.NET INotifyPropertyChanged界面實現,該界面提供了一個名爲PropertyChanged的事件;消息代理構建了一個實現INotifyPropertyChanged的所有插件的列表,並訂閱其他插件此事件。消息傳遞的目的是允許帳戶和事務插件通知存儲插件數據已更改,以便可以保存它。

回答

3

這是我對您的問題的理解:您有一個插件對象可能需要偵聽x數據對象上的事件 - 但您不希望訂閱每個數據對象上的事件。我假設幾個插件可能想要偵聽同一個數據對象上的事件。

您可以創建會話類型對象。每個插件偵聽會話對象上的事件。數據對象不再引發事件 - 它調用會話對象來引發事件(其中一個參數必須是引發事件的數據對象)。

這意味着您的插件只需訂閱一個事件,但它們會從所有數據對象中獲取事件。另一方面,如果一次只有一個插件會監聽數據對象,爲什麼不直接讓數據對象直接調用插件呢?

4

哇!大問題! :)

糾正我,如果我錯了。你現在的基本解決方案就是Observer模式,數據對象(Account等)通知其狀態的變化。您認爲問題在於訂閱插件必須在每個對象中註冊才能處理通知。

這不是問題本身,你可以把事件控制在Domain Model,但我建議你創建一個Service Layer,並在這一層做這個事件通知。這樣,只有一個對象將負責發佈通知。

Martin Fowler在他的博客中有一系列事件模式。 Check it out!非常好的閱讀。

1

它還早,但你有沒有考慮嘗試使用MEF而不是滾動自己?