gpt4 book ai didi

asp.net-mvc-3 - 具有 ASP.NET MVC3 和嵌入式 Razor View 的插件框架

转载 作者:行者123 更新时间:2023-12-02 05:54:10 25 4
gpt4 key购买 nike

我正在使用 Razor View 为 ASP.NET MVC3 设计一个插件框架,但在让嵌入 View 正常工作时遇到问题。

插件框架的设计具有以下功能:

  • 每个插件都有自己的模型、 Controller 和 View 。 View 是嵌入式资源, Controller 派生自 PluginController 类
  • 插件具有对定义 PluginController 基类的共享类库的依赖项引用
  • 托管插件的“shell”Web 应用程序在设计时不得引用任何插件,因为它在设计时并不知道自己拥有哪些插件。
  • 插件 dll 被放置在 shell 应用程序的一个文件夹中,该文件夹不是/bin 文件夹
  • 外壳负责:
    1. 发现插件(使用反射)
    2. 注册所有 Controller (我为此使用 Spring.Net)
    3. 创建到 Controller 的路由
    4. 通过自定义 VirtualPathProvider 提供 razor 文件 (cshtml)

现在一切正常,除非嵌入 View 引用了插件 dll 中的类型。然后我得到了臭名昭著的错误(名字被遗漏):

命名空间“[MyPluginSolution]”中不存在类型或命名空间名称“[Plugins]”(是否缺少程序集引用?)

原因是运行时调用的 csc 编译器来编译 razor View 仅从 bin 文件夹和 GAC 获取 dll 引用

我还尝试使用 this technique 预编译 View 但最终它给出了相同的结果,因为运行时坚持为预编译的 razor View 编译包装器。

我当然可以将插件 dll 放在/bin 文件夹中,但我的问题是:

有没有办法在非 bin(和非 GAC)文件夹中注册 dll,并将它们视为“一等公民”,以便 Razor View 可以使用它们?

最佳答案

好的,使用 this article 找到了解决方案.

首先,我使用 PreApplicationStartMethod 创建一个类。此方法扫描插件文件夹并将 dll 复制到 AppDomain.DynamicDirectory

然后使用 BuildManager.AddReferencedAssembly 加载每个 dll。

瞧,强类型的 Razor View 编译得非常漂亮。请参阅此处的代码:

[assembly: PreApplicationStartMethod(typeof(MySolution.PluginHandler.PluginActivator), "Initialize")]
namespace MySolution.PluginHandler
{
public class PluginActivator
{
private static readonly DirectoryInfo PluginFolderInfo;

static PluginActivator() {
PluginFolderInfo = new DirectoryInfo(HostingEnvironment.MapPath("~/plugins"));
}

public static void Initialize() {
CopyPluginDlls(PluginFolderInfo, AppDomain.CurrentDomain.DynamicDirectory);
LoadPluginAssemblies(AppDomain.CurrentDomain.DynamicDirectory);
}

private static void CopyPluginDlls(DirectoryInfo sourceFolder, string destinationFolder)
{
foreach (var plug in sourceFolder.GetFiles("*.dll", SearchOption.AllDirectories)) {
if (!File.Exists(Path.Combine(destinationFolder, plug.Name))) {
File.Copy(plug.FullName, Path.Combine(destinationFolder, plug.Name), false);
}
}
}

private static void LoadPluginAssemblies(string dynamicDirectory)
{
foreach (var plug in Directory.GetFiles(dynamicDirectory, "*.dll", SearchOption.AllDirectories)) {
Assembly assembly = Assembly.Load(AssemblyName.GetAssemblyName(plug));
BuildManager.AddReferencedAssembly(assembly);
}
}
}
}

我希望这可以帮助其他想要使用这些新技术创建干净的插件框架的程序员。

关于asp.net-mvc-3 - 具有 ASP.NET MVC3 和嵌入式 Razor View 的插件框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6465855/

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