7

私は最近、ASP.NET MVC3/4 を使用してプラグ可能なアプリケーション モジュールを開発する方法に出会い、このアプローチのシンプルさが気に入りました。現在、アプリケーションは次のように構成されています。

ここに画像の説明を入力

したがって、私のアプリケーションの拡張機能を開発したい人は、上記のチュートリアルのアプローチに従って、フォルダーに残る拡張機能を作成しAreasます。Areas新しい(新しいプロジェクトとして作成された)ものが追加されると、.pdbファイルが作成されてbinディレクトリに配置されると思います。私の質問はこれです:

  • Areasプラグ可能なモジュールとして配布するにはどうすればよいですか?
  • Area次のコードを変更して、誰かがフォルダーに新しいものをドロップするbinと、アプリケーションが自動的にそれを取得してリンクを作成するようにするにはどうすればよいですか? そして、プラグインの作成者はこれを有効にするために何をすべきでしょうか?

私の_Layout.cshtml(グローバル共有レイアウト) では、次のようにしてリンクを作成します。

<ul>
      <li>@Html.ActionLink("Area1", "Index", "Area1", new { Area = "Area1" }, null)</li>
      <li>@Html.ActionLink("Area2", "Index", "Area2", new { Area = "Area2" }, null)</li>
      <li>@Html.ActionLink("Area3", "Index", "Area3", new { Area = "Area3" }, null)</li>
</ul>

簡単にするために、エリア名は一意であると仮定します。これを行う方法に関する提案はありますか?

4

5 に答える 5

10

Areas をプラグ可能なモジュールとして配布するにはどうすればよいですか?

ホスティング Web アプリでエリアを作成するのではなく、別の dll にコンパイルする別のプロジェクトを作成します。dll を使用する任意の Web アプリにコピーします。すべての静的ファイルを「EmbeddedResource」として設定することを忘れないでください。

次のコードを変更して、誰かが新しいエリアを bin フォルダーにドロップすると、アプリケーションが自動的にそれを取得してリンクを作成するようにするにはどうすればよいですか? そして、プラグインの作成者はこれを有効にするために何をすべきでしょうか?

MvcContrib PortableAreaRegistration の「バス」を使用して、ポータブル エリアから「バス」上のすべてのユーザーにメッセージやコマンドを送信できます。それはホスティング Web アプリである場合もあれば、理論的には独立したエリアが互いにメッセージを送信できる場合もあります。

github で、このコードの 2 つの大まかな、しかし機能的なデモを作成しました。

MVC3 バージョン:

https://github.com/AkosLukacs/PluggablePortableAreas

MVC4 RC バージョン:

https://github.com/AkosLukacs/PluggablePortableAreasMVC4

まず、必要な情報を伝えるメッセージを定義します。いくつかのプロパティ (PluggablePortableAreas.Common\RegisterAreaMessage.cs) を持つ POCO のみ:

public class RegisterAreaMessage : IEventMessage
{
    public string LinkText { get; private set; }
    public string AreaName { get; private set; }
    public string ControllerName { get; private set; }
    public string ActionName { get; private set; }
    //...
}

そのメッセージ タイプ (PluggablePortableAreas.Common\RegisterAreaEventHandler.cs) のハンドラーを作成します。

public class RegisterAreaEventHandler : MessageHandler<RegisterAreaMessage>{}

この場合、MessageHandler は受信したメッセージを static に追加するだけConcurrentBag<RegisterAreaMessage>です。必要に応じて DI を使用できますが、シンプルに保ちたいと考えています。

次のようなポータブル エリアからメッセージを送信できます (Areas\DemoArea1\Areas\Demo1\Demo1AreaRegistration.cs):

 //the portable area sends a message to the 'bus'
 bus.Send(new RegisterAreaMessage("Link to the Demo area", AreaName, DefaultController, DefaultAction));

動的に追加されたリンクは、メッセージのコレクション (PluggablePortableAreas.Web\Views\Shared_Layout.cshtml) を反復処理することによって表示されます。

                @foreach(var sor in PluggablePortableAreas.Common.RegisterAreaEventHandler.RegisteredAreas) {
                <li>@Html.ActionLink(sor.LinkText, sor.ActionName, sor.ControllerName, new{Area=sor.AreaName}, null)</li>
                }

もう 1 つ気を付けなければならないことは、「完全修飾」エリア名を使用することです。エリア名を明示的に指定しない場合、MVC はそれが現在のエリアであると想定します。"/path_to_your_app/CurrentArea/Home"領域がなくても問題ありませんが、2 番目はではなく を指し"/path_to_your_app/Home"ます。

<li>@Html.ActionLink("Home", "Index", "Home", new { Area = "" }, null)</li>
<li>@Html.ActionLink("I don't work from the portable area!", "Index", "Home")</li>

さらにもう 1 つ注目すべき点があります。

VS の開発サーバーは少し「不安定」に感じます。ポータブル領域がロードされないことがあります。完全な IIS でも確実に動作します...

于 2012-06-18T09:19:43.073 に答える
2

What you're doing looks very much alike the MVCContrib's Portable Areas.

They use the message/application bus pattern to dynamically add new widgets on web elements. MessageHandlers are discovered via reflection and each message is passed to all of them. So in your case the plugin author should just implement a handler for a standard message(say register global menu link).

Resources of the Portable Areas are embedded so just a single dll could be dropped in the bin folder. In order to automatically pick it up and use it in your app you will have to watch the bin folder say via FileSystemWatcher and restart your app(there is no other way to load the new .dll into the AppDomain in asp.net application I think).

You may load .dlls from other folders as well by using BuildManager functionality in ASP.NET 4. More useful info on that here.

于 2012-06-18T09:41:46.013 に答える
1

これは、Orchard CMS がモジュールを実行する方法に似ています。

ギャラリーを見てください... モジュールは、モジュール プロジェクト全体を含む Nuget パッケージとして配布されます。

于 2012-06-15T16:15:34.160 に答える
1

このチュートリアルを見てください。大いに役立つと思います。

于 2012-06-18T10:17:44.673 に答える
1

こんにちは、 nopcommerceプロジェクトでかなり素敵なプラグイン アーキテクチャを探すことができます。

于 2012-06-18T09:28:41.810 に答える