【问题标题】:Creating a Google Labs-like extension feature创建类似 Google Labs 的扩展功能
【发布时间】:2011-01-11 18:32:19
【问题描述】:

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

在我正在开发的这个应用程序中,我有一个基于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 = ...;
    }
}

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

所以这是我无法理解的部分 - 假设我有一个相当复杂的对象模型(因此像 ForumMessage.Forum.etc.Config 这样的做法是不好的做法);

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

你能为这种类型的系统想出更好的设计吗?

编辑

谁能推荐任何关于插件系统的阅读材料?
任何专门针对 Web 环境的内容都将不胜感激。

【问题讨论】:

    标签: c# asp.net blogengine.net


    【解决方案1】:

    如果你想保持当前的扩展系统设计,我会去实现一个自定义 EventArgs 类特定于你的每个事件。通过这种方式,您可以传递各种配置,或者简单地传递标识数据。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多