3

私は PHP のバックグラウンドを持っており、Wordpressをかなり使用してきました。Wordpress のプラグイン アーキテクチャのしくみと、イベントをイベント名にフックする機能が気に入っています。私が気に入っている最高の部分の 1 つは、エンド ユーザーに表示される直前に任意のデータベース値に *add_filter()* できることです。私の質問は、C#.NET 環境でプラグイン アーキテクチャ全体を複製する方法に関するマルチパートですか?

パート 1: プラグインを作成するには、MEF フレームワークがおそらく最適であると調査しました ( 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>";
}

また

例 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

NServiceBusは、これらの問題に大いに役立つと思います。NServiceBus の著者であるUdi Dahanは、パブリッシュ/サブスクライブ メカニズムであるドメイン イベント パターンに関する多くの記事も書いています。

于 2012-01-06T09:39:38.947 に答える
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 に答える