天天看點

建構插件式的應用程式架構(六)-通訊機制

有幾個朋友在回複中希望了解插件之間是如何通訊的。

這個系列的文章寫到這裡,也該談談這個問題了,畢竟已經有了插件管理。不知道大家有沒有注意到我在第四篇文章裡談到的服務容器(Service Container),Service是我所提到的插件式的應用程式架構的基礎,我們也可以回頭看看IApplication的接口定義,IApplication是派生于IServiceContainer。我把應用程式提供的相關的功能抽象成一個一個的Service,比如文檔管理的,我們就抽象成IDocumentService,停靠工具欄管理功能抽象成IDockBarService,菜單管理的功能抽象成IMenuService,等等。我在第四篇文章裡也提到了“我們在使用Service架構的時候,總是傾向于有一個根容器,各個Service容器構成了一個Service容器樹,每一個節點的服務都可以一直向上傳遞,直到根部,而每一個節點請求Service的時候,我們總是可以從根節點獲得。我把這個根節點比喻成一個服務中心,它彙總了所有可提供的服務,當某個對象要請求服務(GetService)隻需要向根結點發送要獲得的服務,根結點就可以把服務的對象傳遞給它。”

IApplication是從IServiceContainer接口派生出來的,而我們的應用程式主視窗又是從IApplication接口派生出來的,是以,我們的應用程式主視窗就是一個ServiceContainer。從IPlugin的定義來看,它有一個IApplication接口屬性,這個IApplication屬性是什麼時候指定的呢,在第五篇文章的源代碼裡我們看到,當每一個Plugin被執行個體化的時候,由PluginService指定的,是以在每一個Plugin被Load之前,IApplication已經被指定,而代表這個IApplication接口的執行個體正是我們的應用程式主視窗,而它正是我們所需要的服務容器。一旦我們能夠獲得IApplication執行個體,我們就可以獲得整個應用程式所提供的所有的服務。假設我們要獲得文檔服務,就可以使用Plugin的Application.GetService(typeof(IdocumentService))來得到文檔服務的執行個體,接着我們就可以使用這個執行個體來完成某項功能,比如添加一個新文檔等等,其實在第五篇文章的源代碼就有這樣代碼:

複制  儲存

當然,要在插件中獲得執行個體,你必須在應用程式裡或者其他插件裡執行個體化服務對象,然後添加到服務容器裡,還拿上邊的例子,我們在應用程式裡執行個體化了PluginService,然後添加到了容器裡,代碼如下:

繼續閱讀