c#中基于列表的发布订阅模式(Wordpress钩子/过滤器)

时间:2012-01-06 09:29:08

标签: c# hook publish-subscribe mediator add-filter

我来自PHP背景,使用 Wordpress 非常多,我喜欢他们的插件架构的工作原理以及将事件挂钩到事件名称的能力。我喜欢它的最好的部分之一是能够在向最终用户显示之前将* add_filter()*添加到任何数据库值。我的问题是如何在C#.NET环境中复制整个插件架构的多部分?

第1部分: 要创建插件我已经研究过 MEF框架可能是最好的(托管扩展框架 -http://mef.codeplex.com/)。这是专门设计用于通过监视新插件的目录,跟踪依赖项和其他正常事物来解决问题。 MEF附带.NET 3.5 +

第2部分 挂钩事件?我似乎无法找到有关复制基于全局通道的事件系统的大量信息。从我到目前为止,我需要一个发布/订阅模式(这不是很难制作,因为你只是创建一些具体的对象并给它们事件)。困难的部分是为每个事件提供一个“频道”名称,并将整个系统中的所有事件作为全局集合的一部分( Mediator模式)。

要复制:(http://codex.wordpress.org/Function_Reference/add_filter)

示例1

// Add's my button to the end of the content
add_filter('the_content', 'my_plugin_button');

function my_plugin_button( $content ) {
    // Add's my button to the end of the content
    return $content . "<a href='#'>My button</a>";
}

OR

示例2

// Add a new admin menu item by hooking in
add_action('admin_menu', 'my_plugin_menu');

function my_plugin_menu() {
    add_options_page('My Plugin Options', 'My Plugin', 'manage_options', 'my-unique-identifier', 'my_plugin_options');
}

我希望你的一切与我同在吗?我已经设法在Javascript中复制我需要的功能,甚至jQuery也有他们的 .on()事件函数......同样的事情,但基于频道或列表...

我的两个例子:

任何人都可以指出我正确的方向,或者这是c#的完全错误的方法吗?

2 个答案:

答案 0 :(得分:0)

我认为NServiceBus可以帮助您解决这些问题。作为NServiceBus的作者的Udi Dahan也写了很多关于域事件模式的文章,这是一个发布/订阅机制。

答案 1 :(得分:0)

知道你发布这个已经很长时间了,你可能已经构建了一些东西。但是我一直在考虑这样的事情。有两个选项 - 真的忘了WordPress并尝试构建更清洁的东西 - 这是WordPress代码底部的一个烂摊子:D

或者这个:

function the_content()
{
        var result = get_the_content();
        // do other stuff...if you want to.
        execute_filters(ref result);
        execute_actions(ref result);

        return result;
}

function execute_filters(ref string result, string action_name)
{
     var filters = get_pre_filters(action_name);
     filters.ForEach(filter =>
     {
         /// somehow call the method name in filter.  PHP is generally global.  C# namespaced,      
         /// so you would need to think about that.
     }
}

function execute_actions(ref string result, string action_name)
{
      /// and so on....
}

当构建模仿WordPress的东西时,你需要记住WordPress插件架构的许多问题(在我个人看来)......它似乎想要在每个页面上运行足够近的每个插件,即使该页面有与该插件无关。我onced安装了一个插件,为每个页面调用添加了60个数据库查询,并且没有使用它。

在构建它时尝试并巧妙地思考它。尝试并添加一种方法,只有在新设置的页面/帖子上使用的插件才能运行,例如在您的数据库中,在帖子/页面对象上有一个“插件”字段,其中包含允许在该页面上运行的插件列表。这样,您每次都不需要检查所有插件,看它是否要运行。

反正。希望你有所作为。