如何将区域分配为可插拔模块?
不要在托管 Web 应用程序中创建区域,而是创建单独的项目,编译为单独的 dll。将 dll 复制到您想要使用它的任何 Web 应用程序中。请记住将所有静态文件设置为“EmbeddedResource”。
如何更改以下代码,以便当有人将新区域放入 bin 文件夹时,应用程序会自动将其拾取并创建链接?插件作者应该怎么做才能启用它?
您可以使用 MvcContrib PortableAreaRegistration 的“总线”从便携式区域向“总线”上的任何人发送消息、命令。这可以是托管网络应用程序,或者理论上独立的区域可以相互发送消息。
在 github 上创建了两个粗略但实用的演示代码:
MVC3 版本:
https://github.com/AkosLukacs/PluggablePortableAreas
MVC4 RC 版本:
https://github.com/AkosLukacs/PluggablePortableAreasMVC4
首先,您定义一个可以携带您需要的信息的消息。只是一个具有一些属性的 POCO (PluggablePortableAreas.Common\RegisterAreaMessage.cs):
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 只是将接收到的消息添加到一个 staticConcurrentBag<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>
}
还要注意一件事:使用“完全限定”的区域名称。如果您没有明确指定区域名称,MVC 会假定它是当前区域。没有区域没有问题,但第二个将指向"/path_to_your_app/CurrentArea/Home"
而不是"/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>
还要注意一件事!
VS中的开发服务器感觉有点“飘忽不定”,有时便携区不加载。在完整的 IIS 中可靠地工作...