gpt4 book ai didi

c# - 动态扩展应用程序的功能?

转载 作者:太空狗 更新时间:2023-10-29 20:00:06 26 4
gpt4 key购买 nike

我最近遇到了一个 way在使用 ASP.NET MVC3/4 时开发可插入的应用程序模块,我喜欢这种方法的简单性。目前,我的应用程序结构如下:

enter image description here

因此,任何想要为我的应用程序开发扩展的人都可以遵循上述 tutorial 中的方法。并创建一个保留在 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>

为简单起见,假设区域名称是唯一的。有关如何执行此操作的任何建议?

最佳答案

如何将区域作为可插入模块进行分发?

不要在托管网络应用程序中创建区域,而是创建单独的项目,编译为单独的 dll。将 dll 复制到您要使用它的任何网络应用程序。请记住将所有静态文件设置为“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 只是将接收到的消息添加到静态 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>
}

还有一件事需要注意:使用“完全限定”的区域名称。如果您没有明确指定区域名称,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 中可靠地工作...

关于c# - 动态扩展应用程序的功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11023748/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com