2010-02-01 37 views
3

我不知道這是否是一個適當的問題要問,因爲它是非常具體的,但無論如何...創建一個谷歌實驗室般的擴展功能

在這個應用中我的工作,我有一個基於static events的擴展系統。 整個想法主要來自BlogEngine.NET中創建的(非常酷的)擴展系統。

本質上,在Application_Start上創建一個擴展實例,該擴展實例掛接到應用程序中的類上的靜態事件。
以一個擴展名爲例,它將黑名單中的文字從論壇消息中刪除,然後再將其顯示到頁面上;當觸發ForumMessage.OnDisplaying事件時,擴展程序將採用ForumMessage發件人對象並用黑白字體替換黑名單中的單詞。

實施例:

static class WordBlackListExtension { 
    private static string[] _blacklist = new string[] { ... }; 
    static WordBlacklistExtension() { ForumMessage.OnDisplaying += DoWork; } 
    private static void DoWork(object sender, EventArgs e) { 
     // Do some blacklist filtering... 
     ((ForumMessage)sender).Body = ...; 
    } 
} 

然而,因爲僅存在一個在App域每個延伸的情況下,它發生在我的系統中這僅適用那裏有一個單,系統範圍的配置每個擴展名爲
但是如果我希望每個論壇或每個用戶都能控制這些擴展程序,例如Google實驗室?每個論壇黑名單,或每個用戶啓用/禁用擴展的能力?
我將不得不將其他信息傳遞給擴展。所以這裏是我無法包裹頭部的部分 - 假設我有一個相當複雜的對象模型(因此,像ForumMessage.Forum.etc.Config這樣做是不好的做法);

你會如何建議將這些信息傳遞給每個擴展?
每個擴展應該檢索自己的配置嗎?也許通過EventArgs傳遞某種上下文對象?
我在哪裏可以確定哪個論壇的配置要檢索?

你能想到這種類型的系統更好的設計嗎?

編輯

誰能推薦關於插件系統的任何閱讀材料?
任何特別在網絡環境中的東西將不勝感激。

回答

2

如果你想繼續使用當前的擴展系統設計,我會去實現一個自定義的EventArgs類,該類專用於每個事件。通過這種方式,您可以傳遞各種配置或簡單的識別數據。

您的擴展提供商然後可以根據傳遞的信息採取行動。例如,他們可以配置爲只回應特定的論壇等。