3

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

第 1 部分: 要创建插件,我研究过MEF 框架可能是最好的(托管可扩展性框架-http://mef.codeplex.com/)。这是专门为解决繁重的工作而设计的,使您能够监视目录中的新插件、跟踪依赖项和其他正常事物。MEF 附带 .NET 3.5+

第 2 部分 挂钩事件?我似乎找不到太多关于复制基于全局通道的事件系统的信息。据我所知,我需要一个发布/订阅模式(这并不难,因为你只需创建一些具体的对象并给他们事件)。困难的部分是给每个事件一个“通道”名称,并使整个系统中的所有事件成为全局集合的一部分(中介模式)。

复制:(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个例子:

谁能指出我正确的方向,或者这对 c# 来说是完全错误的方法吗?

4

2 回答 2

0

知道您发布此内容已经很长时间了,您可能已经构建了一些东西。但是,我自己一直在考虑这样的事情。有 2 个选项 - 真的忘记 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 个数据库查询,但它没有被使用。

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

无论如何。希望你有一些工作。

于 2013-11-16T15:39:03.023 回答
0

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

于 2012-01-06T09:39:38.947 回答