我不知道这是否是一个适当的问题要问,因为它是非常具体的,但无论如何...创建一个谷歌实验室般的扩展功能
在这个应用中我的工作,我有一个基于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传递某种上下文对象?
我在哪里可以确定哪个论坛的配置要检索?
你能想到这种类型的系统更好的设计吗?
编辑
谁能推荐关于插件系统的任何阅读材料?
任何特别在网络环境中的东西将不胜感激。