创建类似Google Labs的扩展功能

时间:2010-02-01 15:24:33

标签: c# asp.net blogengine.net

我不确定这是否是一个值得提出的问题,因为它非常具体,但无论如何......

在我正在处理的这个应用程序中,我有一个基于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 Domain中每个扩展只有一个实例,因此我认为这只适用于每个扩展都有单一,系统范围配置的系统。
但是,如果我希望每个论坛或每个用户控制这些扩展,例如Google实验室,该怎么办?每个论坛的黑名单,或每个用户启用/禁用扩展的能力?
我必须将其他信息传递给扩展程序。

所以这是我无法解决的问题 - 假设我有一个相当复杂的对象模型(因此做类似ForumMessage.Forum.etc.Config的事情是不好的做法);

您如何建议将该信息传递给每个分机? 每个扩展应该检索自己的配置吗?也许通过EventArgs传递某种上下文对象?
我在哪里可以确定哪个论坛的配置要检索?

你能想到这种系统更好的设计吗?

修改

任何人都可以推荐任何有关插件系统的阅读资料吗? 任何专门针对Web环境的内容都会受到最高的赞赏。

1 个答案:

答案 0 :(得分:2)

如果您想继续使用当前的扩展系统设计,我将实现一个特定于您的每个事件的自定义EventArgs类。通过这种方式,您可以传递各种配置,或简单地识别数据。

然后,您的扩展程序提供商可以根据传递的信息采取措施。例如,他们可以配置为仅响应特定论坛等。