我不确定这是否是一个合适的问题,因为它非常具体,但无论如何......
在我正在开发的这个应用程序中,我有一个基于静态事件的扩展系统。整个想法主要来自于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 = ...;
}
}
但是,由于在应用程序域中每个扩展只有一个实例,因此在我看来,这只适用于每个扩展都有一个单一的系统范围配置的系统。
但是,如果我希望按论坛或按用户控制这些扩展,例如在 Google 实验室中,该怎么办?每个论坛黑名单,还是每个用户启用/禁用扩展的能力?
我必须将其他信息传递给扩展程序。
所以这是我无法理解的部分 - 假设我有一个相当复杂的对象模型(因此做类似的事情ForumMessage.Forum.etc.Config
是不好的做法);
您建议如何将该信息传递给每个扩展程序?
每个扩展都应该检索自己的配置吗?也许通过 EventArgs 传递某种上下文对象?
我在哪里可以确定要检索哪个论坛的配置?
你能为这种类型的系统想出更好的设计吗?
编辑
任何人都可以推荐任何关于插件系统的阅读材料吗?
任何专门针对 Web 环境的内容都将不胜感激。