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

本文关键字:过滤器 模式 Wordpress 挂钩 于列表 列表 | 更新日期: 2023-09-27 18:19:40

我有PHP背景,经常使用Wordpress,我喜欢他们的插件架构的工作方式以及将事件挂接到事件名称的能力。我最喜欢它的一点是,在它显示给最终用户之前,可以将_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>";
}

示例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()事件函数。。。相同的东西,但基于频道或列表。。。

我的2个例子:

  • http://jsfiddle.net/AaronLayton/U3ucS/53/
  • http://jsfiddle.net/AaronLayton/eyNre/33/

有人能给我指出正确的方向吗?或者这是c#完全错误的方法吗?

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

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

知道你已经很久没有发布这篇文章了,你可能已经构建了一些东西。然而,我自己也一直在考虑这样的事情。有两种选择-真的忘记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插件架构的许多问题(在我个人看来)。。。它似乎希望在每个页面上运行每个插件,即使该页面与该插件无关。我曾经安装了一个插件,在每个页面调用中添加了60个数据库查询,但没有使用。

当你构建它的时候,试着聪明一点。试着添加一种方法,只让将在你的新设置的页面/帖子上使用的插件运行。例如,在你的数据库中,在帖子/页面对象上有一个"插件"字段,其中有一个允许在该页面上运行的插件列表。这样你就不需要每次都检查所有的插件来查看它是否想要运行。

无论如何。希望你能有所收获。