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 でも確実に動作します...