2010-02-01 51 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类,该类专用于每个事件。通过这种方式,您可以传递各种配置或简单的识别数据。

您的扩展提供商然后可以根据传递的信息采取行动。例如,他们可以配置为只回应特定的论坛等。