另一个组件中的 MVC 6 RC2 控制器

2023-11-25

在 MVC 6 RC1 中我们使用了IAssemlbyProvider接口来注册在运行时发现的程序集并注入其他控制器类型,以类似的方式时尚到这篇文章.. 现在随着 RC2 的发布IAssemblyProvider已被删除并更改为(见参考资料).

目前我们的框架版本是net46.

自从升级以来,我们在外部组件(未引用)中的控制器正在返回404地位。

我们尝试通过以下方式手动将控制器添加到注册的控制器中ApplicationPartManager.

var mvcBuilder = services.AddMvc();
var controllerFeature = new ControllerFeature();
mvcBuilder.PartManager.PopulateFeature(controllerFeature);

var moduleControllers = ModulesManager.GetControllers();
foreach (var c in moduleControllers)
    controllerFeature.Controllers.Add(c);

mvcBuilder.PartManager.PopulateFeature(controllerFeature);

and...

services.AddMvc().ConfigureApplicationPartManager(app =>
{
    var controllerFeature = new ControllerFeature();
    app.PopulateFeature(controllerFeature);

    var moduleControllers = ModulesManager.GetControllers();
    foreach (var c in moduleControllers)
        controllerFeature.Controllers.Add(c);

    app.PopulateFeature(controllerFeature);
});

现在程序集肯定已加载到AppDomain因为我们的依赖注入系统正在为外部程序集中的其他项目查找并填充服务。

在我们之前的实现中,使用以下方法效果很好IAssemblyProvider.

public class ModuleAwareAssemblyProvider : IAssemblyProvider
{
    private readonly DefaultAssemblyProvider _defaultProvider;

    public ModuleAwareAssemblyProvider(DefaultAssemblyProvider defaultProvider)
    {
        _defaultProvider = defaultProvider;
    }

    public IEnumerable<Assembly> CandidateAssemblies
    {
        get
        {
            return _defaultProvider.CandidateAssemblies.Concat(ModulesManager.Assemblies).Distinct();
        }
    }
}

我知道 RC2 仍然相对较新,但如果有人有任何经验,在启动时注册额外的控制器将会有所帮助。

干杯,尼科


经过一段时间的工作后ControllerFeature直接没有结果,是时候回到基础了。

基本上在应用程序启动时注册控制器into控制器功能容器not from控制器功能。这是关键,因为您需要注册控制器。

我正在浏览RC2 的 GitHub 存储库并遇到了ControllerFeatureProvider。就像声明的那样。

Discovers controllers from a list of <see cref="ApplicationPart"/>

然后还有一个方法进一步深入PopulateFeature我们可以看到它抓取了注册到应用程序的所有部分并提取了控制器接口(IsController()方法值得回顾)。

/// <inheritdoc />
public void PopulateFeature(
    IEnumerable<ApplicationPart> parts,
    ControllerFeature feature)
{
    foreach (var part in parts.OfType<IApplicationPartTypeProvider>())
    {
        foreach (var type in part.Types)
        {
            if (IsController(type) && !feature.Controllers.Contains(type))
            {
                feature.Controllers.Add(type);
            }
        }
    }
}

现在我们知道控制器是如何找到的,它们来自ApplicationPart注册到应用程序。下一个问题是我们如何创建应用程序部分.

经过一番审查并尝试使用依赖项注入,手动将部件添加到应用程序以注册我的部件后,我遇到了另一个概念。

界面IMvcBuilder有扩展方法AddApplicationPart这增加了一个Assembly到应用部分。这是通过将组件包装在一个AssemblyPart应用部分。经审查AssemblyPart该部分将程序集中找到的所有类型返回到调用部分系统(在我们的例子中ControllerFeatureProvider).

/// <inheritdoc />
public IEnumerable<TypeInfo> Types => Assembly.DefinedTypes;

现在有一些有趣的事情AssemblyPart是方法GetReferencePaths()

/// <inheritdoc />
public IEnumerable<string> GetReferencePaths()
{
    var dependencyContext = DependencyContext.Load(Assembly);
    if (dependencyContext != null)
    {
        return dependencyContext.CompileLibraries.SelectMany(library => library.ResolveReferencePaths());
    }

    // If an application has been compiled without preserveCompilationContext, return the path to the assembly
    // as a reference. For runtime compilation, this will allow the compilation to succeed as long as it least
    // one application part has been compiled with preserveCompilationContext and contains a super set of types
    // required for the compilation to succeed.
    return new[] { Assembly.Location };
}

看来最后的难题是启用preserveCompilationContext在模块(或外部程序集)的project.json 文件中。

"preserveCompilationContext": {
    "type": "boolean",
    "description": "Set this option to preserve reference assemblies and other context data to allow for runtime compilation.",
    "default": false
}

最后,这个问题的实现和解决变得非常简单。我们的每个外部程序集(或模块)都是通过我们的ModuleManager班级。其中包含所有引用的模块程序集的列表。所以在ConfigureServices方法中的Startup.cs注册 MVC 的文件,我们只需调用扩展方法AddApplicationPart对于每个模块组件。

var mvcBuilder = services.AddMvc();
foreach(var module in ModulesManager.ReferencedModules)
{
    mvcBuilder.AddApplicationPart(module.ReferencedAssembly);
}

一旦做出这些小改变,我的外部控制器就停止返回404.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

另一个组件中的 MVC 6 RC2 控制器 的相关文章

随机推荐

  • 最小起订量 你如何测试内部方法?

    我的老板告诉我使用起订量 就是这样 我喜欢它 但似乎与 MSTest 或 mbunit 等不同 你无法测试内部方法 所以我被迫在我的界面中公开一些内部实现 以便我可以测试它 我错过了什么吗 您可以使用 Moq 测试内部方法吗 多谢 您可以使
  • Yii2 QueryBuilder 更新与连接

    我有以下原始 SQL 查询 UPDATE pay audit JOIN invoice items ON invoice items mdn pay audit account id AND invoice items unitprice
  • 登录时未从 Facebook API 获取电子邮件

    我在登录时遇到问题 即使将电子邮件添加到用户和朋友权限 对于某些 Facebook 帐户 我也无法收到电子邮件 我正在使用 facebook php sdk 这是我使用的代码 facebook user profile facebook g
  • 插件 ID 包含无效的字符“:”(仅 ASCII 字母数字字符、“.”、“_”和“-”字符是有效的 JETPACK COMPOSE

    我想在我的 android 项目中安装 jetpack compose 我正在遵循这个指南 https developer android com jetpack compose interop adding 但是当我尝试同步项目时 我的
  • 在 Go 中使用原始套接字

    我正在尝试编写一个程序 该程序接收 DHCP 发现 UDP 并根据 DHCP 数据包中特定字段 GIADDR 的内容 使用不同的源 IP 地址将它们转发到给定的 IP 地址 我可以开始处理接收和发送位 但在使用本地计算机上未配置的 IP 地
  • 是否可以检查 jQuery.post() 的超时?

    我有这段代码请求来自 mysql 数据库的一些文件夹信息 function gotoDir pmcat id pcat id slideshowContainer html img class loader src javascript a
  • 编译器是否对异步方法链执行“返回值优化”

    不是传统意义上的返回值优化 但我想知道你什么时候会遇到这样的情况 private async Task Method1 await Method2 private async Task Method2 await Method3 priva
  • Objective-C 类参考:符号未找到错误

    我已经在这个 iPhone 应用程序上工作了一段时间了 我已经完全完成并可以使用它了 我正在扩展的项目是从在线颠覆存储库下载的 我的教授也给了我访问权限 我不小心没有下载 根 副本或类似的东西 所以我无法向存储库提交任何更改 在老师的帮助下
  • 为什么 stddef.h 不在 /usr/include 中?

    我已经编译了gnu标准库并将其安装在 GLIBC INST 现在 我尝试编译一个very简单的程序 仅使用一个 include include
  • 如何通过切片符号 a[::-1] 解释序列的反转

    来自python org 教程 切片索引有有用的默认值 省略的第一个索引默认为零 省略的第二个索引默认为被切片的字符串的大小 gt gt gt a hello gt gt gt print a 1 olleh 正如教程所说a 1 应该等于a
  • 将变量从 PHP 导出到 shell

    我正在尝试设置一个可以从 PHP 外部访问的变量 理想情况下 这应该是局部变量 但也欢迎环境变量 首先 我尝试过putenv 但这没有给出结果 php r putenv PHP TEST string 回显 PHP TEST 当我打电话时g
  • Altair 中 mark_text 的格式文本

    我正在尝试创建一个类似于以下内容的图表多行工具提示示例 但我想格式化正在打印的字符串 以便在末尾添加一些文本 我正在尝试修改这部分 Draw text labels near the points and highlight based o
  • 用于分割嵌套坐标字符串的正则表达式

    我有一个格式的字符串 1 2 2 3 3 4 具有任意数量的元素 我试图将它拆分为分隔坐标的逗号 即检索 1 2 2 3 and 3 4 我可以用Java正则表达式来做吗 我是一个十足的菜鸟 但希望 Java 正则表达式足够强大 如果不是
  • WebSphere 7. 从另一个应用程序注入 EJB

    我正在尝试使用 EJB 注释注入 EJB 当我将一个 EJB 注入同一只耳朵中的另一个 EJB 时 它工作正常 当我从同一耳朵的另一只耳朵将一个 EJB 注入另一个 EJB 时 服务器我得到一个异常 EJB 在调用期间抛出意外的 未声明的
  • 如何确定网络服务器运行的是 Linux 还是 Windows? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我被要求查明某个特定站点是否运行 Windows 或 Linux 作为其网络服务器 通常我们可以访问 我只需上传一个 phpinfo 文件 这将为我提供所需的所有相关信息 但是我们
  • 适用于 Java 的 Eclipse IDE - 全深色主题

    有什么办法可以让Eclipse彻底变成黑暗IDE吗 这是一个Picture我要问的 我不介意花 1 小时的时间来做这样的事情 D EDIT As Konstantin Komissarchik said I had to modify my
  • 为 Actionbar SearchView 创建异步 ContentProvider

    我的 ActionBar 中有一个 SearchView 它与 ContentProvider 连接以提供搜索建议 这些建议并非来自数据库 与通常的 ContentProvider 一样 而是来自 Web 服务 这就是为什么我必须异步处理
  • 如何在 IIS7 中使用 gzip 压缩?

    我已经为IIS7安装了静态和动态压缩 并设置了这两个web config我的应用程序的值Virtual Folder等级 据我了解 我不再需要在服务器或站点级别启用压缩 并且我可以使用 web config 文件按文件夹进行管理 我的里面有
  • JavaScript 数组:获取项目的“范围”

    是否有与 ruby 相当的东西array n m 在 JavaScript 中 例如 gt gt a a b c d e f g gt gt a 0 2 gt a b c Use the array slice begin end 功能 v
  • 另一个组件中的 MVC 6 RC2 控制器

    在 MVC 6 RC1 中我们使用了IAssemlbyProvider接口来注册在运行时发现的程序集并注入其他控制器类型 以类似的方式时尚到这篇文章 现在随着 RC2 的发布IAssemblyProvider已被删除并更改为 见参考资料 目