尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Orchard Core 1.8.1 版本解析:GraphQL 依赖修复、默认显示名与 Keyed Services 支持

发布时间:2026/9/29 3:22:53

资讯中心
01
ARTICLE

Orchard Core 1.8.1 版本解析:GraphQL 依赖修复、默认显示名与 Keyed Services 支持

Orchard Core 1.8.1 版本解析:GraphQL 依赖修复、默认显示名与 Keyed Services 支持
CMS后端Web框架【免费下载链接】OrchardCoreOrchard Core is an open-source modular and multi-tenant application framework built with ASP.NET Core, and a content management system (CMS) built on top of that framework.项目地址https://gitcode.com/gh_mirrors/or/OrchardCore点击查看免费下载Orchard Core 1.8.1 是 2024 年 1 月 9 日发布的一个补丁版本聚焦于四项关键修复与能力增强GraphQL 依赖项修复、内容类型默认显示名的自动补全、ShellScopeServices对 Keyed Services 的完整支持以及 Media Field 依赖修复。本文基于 src/docs/releases/1.8.1.md 的官方发布说明结合当前仓库源码逐条还原这些变更的底层实现与影响范围帮助开发者在升级 1.8.1 时准确评估变更点并理解多租户 DI 容器与内容定义元数据的工作机制。版本概览与升级背景项目内容版本号1.8.1发布日期2024 年 1 月 9 日上一版本1.8.0变更性质缺陷修复 能力增强均为向后兼容的增量改动该版本没有引入破坏性的 API 变更四条改动分别落在 GraphQL 模块、内容管理抽象层Content Management Abstractions和多租户 Shell 作用域Shell Scope三个区域。下面按发布说明的顺序逐条展开。一、修复 GraphQL 依赖项PR #15015发布说明第一条为 Fix dependencies for GraphQL由 MikeAlhayek 提交。该修复针对的是OrchardCore.ContentManagement.GraphQL项目与其依赖模块之间的包引用关系问题。从当前仓库的注册入口 ServiceCollectionExtensions.cs 可以看到AddContentGraphQL()扩展方法集中注册了 GraphQL 所需的 Schema 构建器、查询类型、权限提供者与过滤类型public static IServiceCollection AddContentGraphQL(this IServiceCollection services) { services.AddSingletonISchemaBuilder, ContentItemQuery(); services.AddSingletonISchemaBuilder, ContentTypeQuery(); services.AddTransientContentItemInterface(); services.AddTransientContentItemType(); services.AddPermissionProviderPermissions(); services.AddScopedIContentTypeBuilder, TypedContentTypeBuilder(); services.AddScopedIContentTypeBuilder, DynamicContentTypeQueryBuilder(); services.AddOptionsGraphQLContentOptions(); services.AddGraphQLFilterTypeContentItem, ContentItemFilters(); services.AddWhereInputIndexPropertyProviderContentItemIndex(); return services; }同文件中还提供了AddContentFieldsInputGraphQL()用于将动态内容字段的索引别名提供者DynamicContentFieldsIndexAliasProvider以作用域方式注册并同时暴露为IIndexAliasProvider与IContentDefinitionEventHandler源码位置。此次依赖修复的实质是补齐这些 GraphQL 注册所依赖的程序集引用尤其是OrchardCore.Apis.GraphQL.Abstractions、OrchardCore.ContentManagement.Abstractions等确保在引用OrchardCore.ContentManagement.GraphQL时不会出现编译期缺少依赖或运行时程序集加载失败的问题。对于模块开发者的直接影响是升级到 1.8.1 后引用 GraphQL 相关包时的依赖解析更干净无需手动补充多余的包引用。二、仅在未指定时设置默认显示名PR #15013第二条 Set a default display name only when none is specified 由 giannik 与 MikeAlhayek 共同提交是本次版本中对内容类型Content Type与内容部件Content Part元数据行为的修正。该修复的核心逻辑位于 ContentPartDefinitionBuilder.cs 与同文件第 198-201 行if (string.IsNullOrEmpty(settings.DisplayName)) { settings.DisplayName fieldName; }也就是说只有当DisplayName设置为空时系统才会回退使用字段名或部件名作为默认显示名如果开发者已经显式指定了显示名则该值会被原样保留不会被覆盖。在类型层面ContentTypeDefinition.cs 提供了配套的回退语义/// Returns the see crefDisplayName/ value of the type if defined, /// otherwise the technical name of the type. public string GetDisplayName() string.IsNullOrEmpty(DisplayName) ? Name : DisplayName;配合 ContentTypePartExtensions.cs 中的DisplayName()扩展方法可以看到完整的显示名解析链部件级设置中的DisplayName优先其次回退到内容类型自身的显示名最后才是部件/字段的技术名称。这次修复针对的正是此前版本中的一个边界缺陷在定义新部件或通过 API 修改部件设置时如果代码路径中存在隐式的默认值写入可能把用户已配置的显示名覆盖掉。修复后默认显示名仅在完全未指定时补全语义更符合直觉也保证了导入导出Deployment场景下显示名设置的往返一致性。三、ShellScopeServices 增加 Keyed Services 支持PR #14998第三条 Add Keyed services support in ShellScopeServices 是本次版本中技术含量最高的一项改动它让 Orchard Core 的多租户 Shell 作用域服务解析与 .NET 8 引入的 Keyed Services 机制完成了对齐。背景什么是 Keyed Services.NET 8 的 Microsoft.Extensions.DependencyInjection 引入了键控服务Keyed Services允许同一个服务类型注册多个实现并通过字符串或对象键来区分。典型用法services.AddKeyedSingletonICache, MemoryCache(memory); services.AddKeyedSingletonICache, RedisCache(redis); // 按键解析 var cache serviceProvider.GetRequiredKeyedServiceICache(redis);在 Orchard Core 中每个租户Tenant拥有独立的 Shell 作用域与组合根Composition Root服务解析需要经过ShellScope才能拿到当前租户的容器。此前ShellScopeServices仅实现了普通的IServiceProvider无法处理键控服务的解析请求。实现细节修复后的 ShellScopeServices.cs 实现了IKeyedServiceProvider接口public class ShellScopeServices(IServiceProvider services) : IKeyedServiceProvider { private readonly IServiceProvider _services services; private IServiceProvider Services ShellScope.Services ?? _services; public object GetKeyedService(Type serviceType, object serviceKey) Services.GetKeyedService(serviceType, serviceKey); public object GetRequiredKeyedService(Type serviceType, object serviceKey) Services.GetRequiredKeyedService(serviceType, serviceKey); public object GetService(Type serviceType) Services?.GetService(serviceType); }ShellScopeServices是一个感知当前 ShellScope 的 IServiceProvider当存在活动的ShellScope时优先从其容器解析否则回退到构造时注入的宿主级IServiceProvider。新增的两个键控解析方法将请求透传给底层的IKeyedServiceProvider从而让租户容器内也能正常解析键控服务。配套的容器克隆逻辑为了让键控 Singleton 在多租户容器中正确共享ServiceProviderExtensions.cs 中的CreateChildContainer也同步做了配套处理其中关键的几处分支按(ServiceType, ServiceKey)分组遍历服务描述符第 19 行确保键控与非键控服务各自独立处理对可释放IDisposable或带工厂的键控单例通过serviceProvider.GetRequiredKeyedService(ServiceType, ServiceKey)立即从宿主容器解析实例再克隆到租户容器第 50-55 行对不可释放的键控单例注册一个带键的工厂(sp, key) serviceProvider.GetRequiredKeyedService(service.ServiceType, key)实现首次请求时才解析的惰性语义第 65-69 行当同一类型存在多个键控注册时使用GetKeyedServices(ServiceType, ServiceKey)从宿主容器批量解析并仅克隆其中的单例第 81-83 行。此外OrchardCore.Abstractions 层的 ServiceProviderExtensions.cs 还提供了GetKeyedService扩展方法作为 .NET 10 之前目标框架下的兼容垫片当底层 provider 实现IKeyedServiceProvider时直接透传否则抛出InvalidOperationException明确提示当前服务提供者不支持键控服务。开发者如何使用升级到 1.8.1 后模块内可以安全地使用AddKeyedSingleton/AddKeyedScoped注册键控服务并在构造函数中通过[FromKeyedServices(key)]参数注入或调用GetRequiredKeyedServiceT(key)解析。无论是宿主级还是租户级容器ShellScopeServices都能正确路由键控解析请求。四、修复 Media Field 依赖PR #15017第四条 Fix Media Field dependency 同样由 MikeAlhayek 提交修复的是OrchardCore.Media模块中媒体字段Media Field相关依赖的注册或引用关系问题。媒体字段的编辑界面在仓库中对应多套形状Shape模板分别面向不同的使用场景MediaField.Edit.cshtml标准编辑模板MediaField-Attached.Edit.cshtml附件模式MediaField-Gallery.Edit.cshtml画廊模式MediaFieldSettings.Edit.cshtml字段设置面板从发布说明的措辞与版本节奏判断此次修复与上述依赖引用的完整性相关目的是保证引用媒体字段的项目不会因缺少依赖而出现编辑界面加载失败或字段驱动Display Driver注册异常。对于使用MediaField的站点建议升级后回归验证媒体字段的创建、编辑与保存流程以及媒体库Media Library选择器的打开行为。升级建议与回归验证清单综合本次版本的四处变更建议在升级到 1.8.1 后重点回归以下场景GraphQL 查询启用 Content Management GraphQL 的站点验证内容类型与内容项的查询、过滤Filter与排序Sort行为正常内容类型显示名对显式设置了显示名的内容类型、部件与字段做一次导入导出Deployment往返验证确认显示名未被覆盖或丢失键控服务若模块中使用了AddKeyedSingleton/GetRequiredKeyedService确认在多租户环境下解析正常单例不会被重复实例化媒体字段验证媒体字段的编辑、预览与保存尤其是依赖媒体库选择器的场景。参考源码路径速查本次变更涉及的核心文件均可在此仓库中直接查阅变更点关键文件GraphQL 依赖修复src/OrchardCore/OrchardCore.ContentManagement.GraphQL/ServiceCollectionExtensions.cs默认显示名ContentPartDefinitionBuilder.cs、ContentTypeDefinition.csKeyed Services 支持ShellScopeServices.cs、ServiceProviderExtensions.csMedia Field 依赖修复src/OrchardCore.Modules/OrchardCore.Media/Views/MediaField.Edit.cshtml需要说明的是1.8.1 的官方变更日志仅给出了 PR 标题与作者信息未附详细代码 diff上文对实现细节的还原基于当前仓库源码与代码结构推断实际改动以官方提交历史为准。若需了解更早版本的演进脉络可对照仓库中 src/docs/releases 目录下的其他发布说明。赞分享CMS后端Web框架【免费下载链接】OrchardCoreOrchard Core is an open-source modular and multi-tenant application framework built with ASP.NET Core, and a content management system (CMS) built on top of that framework.项目地址https://gitcode.com/gh_mirrors/or/OrchardCore点击查看免费下载相关推荐Zcash 6.3.0-rc1 版本要点解析Orchard 透明余额 API 修复与 v5 交易版本默认化Zcash 6.3.0 rc1 版本要点解析Orchard 透明余额 API 修复与 v5 交易版本默认化 概览 这是 Zcash 6.3.0 rc1 的版本区块链密码学Bit v1.11.3 版本解析env.jsonc 的 npm alias 支持、bit delete --snap 与依赖处理修复Bit v1.11.3 版本解析env.jsonc 的 npm alias 支持、 bit delete snap 与依赖处理修复 本文基于仓库内 relea开发工具CLI构建工具MCP 服务pnpm 修复详解Git 依赖在 package.json 中保留 branch、tag 与版本范围避免 pnpm update 跳回默认分支pnpm 修复详解Git 依赖在 package.json 中保留 branch、tag 与版本范围避免 pnpm update 跳回默认分支 导读 本篇文包管理器开发工具CLI上一篇Using IconFont in G6: A Practical Guide to Font Icon Nodes, Toolbar Icons, and the getIcon() Helper下一篇小米Home Assistant集成浴霸模式丢失从症状判断到一键恢复的完整修复指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。