一旦解決了加載插件的問題(在.NET中通過MEF出現的情況),下一步要解決的就是與它們的通信。簡單的方法是實現一個接口並使用插件實現,但有時插件只需要擴展應用程序的工作方式,並且可能有很多擴展點。擴展/插件通信的體系結構
我的問題是關於如何處理該擴展點。我見過這樣做,不同的方式,但我不知道每個人的優點和缺點,如果有更多更好的方式來做到這一點:
- 活動:添加靜態事件,所有的東西我們想讓「可擴展」。例如,如果我想爲User類添加自定義驗證,則可以添加一個OnValidation靜態事件處理程序,並在構建時從該插件向它添加事件。
- 信息:有一個公共汽車和一條消息。插件可以訂閱特定的消息,並在其他類發佈該消息時進行操作。消息應該包含插件可以工作的上下文。在驗證情況下,邏輯層將發佈UserValidation消息,並且插件將在接收到消息時採取行動。
- 接口:主機應用程序負責調用實現某些接口的所有插件,併爲它們提供當前操作的上下文。在驗證的情況下,插件可以使用Validate(對象上下文)方法實現IValidator或IUserValidator。
你曾經使用過某種暴露的方法嗎?哪一個最適合你?
在您提出問題之前,我們的應用程序是一個可擴展的核心(用戶,rola和內容管理),用於構建以客戶端爲中心的Web應用程序。構建在ASP.NET MVC上的所有東西。
接口可能是我的方法,雖然它取決於應用程序和它的插件需求。 但是這是一個非常乾淨的插件方法,並且也很容易從插件中分離出異常。 – 2009-11-18 12:53:23