Шаблон подписки для публикации на основе списка в c # (WordPress-хуки / фильтры) - PullRequest
3 голосов
/ 06 января 2012

Я пришел из PHP и довольно много использовал Wordpress , мне нравится, как работает их архитектура плагина и возможность привязывать события к именам событий. Одна из лучших частей, которые мне нравятся, это возможность * add_filter () * к любому значению базы данных непосредственно перед тем, как оно будет показано конечному пользователю. Мой вопрос состоит из нескольких частей о том, как воспроизвести всю архитектуру плагинов в среде C # .NET?

Часть 1: Для создания плагинов я исследовал, что MEF framework , вероятно, будет лучшим ( Managed Extensibility Framework - 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 есть функция события .on () ... то же самое, но на основе канала или списка ...

Мои 2 примера:

Может кто-нибудь указать мне правильное направление или это совершенно неправильный подход для c #?

Ответы [ 2 ]

0 голосов
/ 16 ноября 2013

Знайте, что прошло много времени с тех пор, как вы опубликовали это, и вы, вероятно, уже что-то создали. Однако я сам думал о чем-то подобном. Есть 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 со списком плагинов, разрешенных для запуска на этой странице. Таким образом, вам не нужно будет каждый раз проверять все плагины, чтобы узнать, хочет ли он работать.

В любом случае. Надеюсь, у вас что-то работает.

0 голосов
/ 06 января 2012

Я думаю, NServiceBus может помочь вам в решении этих проблем. Уди Дахан , который является автором NServiceBus, также написал много статей о шаблоне Domain Event, который является механизмом публикации / подписки.

...