2012-01-06 78 views
3

我来自一个PHP的背景,并使用WordPress的颇多,我爱怎么他们插件架构作品和挂钩事件到事件的能力名。我喜欢的最好的部分之一就是能够在将数据库值显示给最终用户之前,将* add_filter()*添加到任何数据库值。我的问题是关于如何在C#.NET环境中复制整个插件体系结构的多部分内容?基于列表发布在C#订阅模式(WordPress的钩/过滤器)

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>"; 
} 

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有其。对()事件函数...同样的事情,但基于信道或列表...

我的2个例子:

任何人都可以点我在正确的方向或者这是C#中完全以错误的做法?

回答

0

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

+0

感谢您的回复Espen,但是我更倾向于开源解决方案或仅仅是基于列表的事件系统的简单复制。任何人有任何想法? – Aaron 2012-01-10 09:04:30

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个数据库查询,并没有使用它。

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

反正。希望你有一些工作。