ASP.NET Core 5.0 Blazor重大变更:JSObjectReference类型改为internal访问级别
docs This repository contains .NET Documentation. 项目地址: https://gitcode.com/gh_mirrors/docs2/docs
背景介绍
在ASP.NET Core 5.0 RC1版本中,Blazor引入了两个重要的JavaScript互操作类型:JSObjectReference
和JSInProcessObjectReference
。这些类型原本设计为公开(public)访问级别,但在RC2版本中,开发团队决定将它们改为内部(internal)访问级别。
变更详情
变更版本
ASP.NET Core 5.0 RC2
旧行为
在RC1版本中,开发者可以直接使用JSObjectReference
类型来引用JavaScript对象。例如:
var jsObjectReference = await JSRuntime.InvokeAsync<JSObjectReference>(...);
新行为
从RC2版本开始:
JSObjectReference
类型被标记为internal
- 需要使用
IJSObjectReference
接口替代 - 同步版本的
JSInProcessObjectReference
同样改为internal
,需使用IJSInProcessObjectReference
接口
正确的新用法示例:
var jsObjectReference = await JSRuntime.InvokeAsync<IJSObjectReference>(...);
变更原因分析
这一变更主要是为了保持Blazor框架内部的一致性。开发团队认为:
- 接口更适合表示JavaScript对象引用这种抽象概念
- 与现有的
IJSRuntime
接口风格保持一致 - 遵循了.NET中常见的"接口优于具体类"的设计原则
- 为未来可能的实现变更提供了更大的灵活性
迁移指南
对于受影响的代码,需要进行以下修改:
- 将所有
JSObjectReference
类型引用替换为IJSObjectReference
- 将所有
JSInProcessObjectReference
类型引用替换为IJSInProcessObjectReference
- 检查类型转换和类型检查代码,确保使用接口而非具体类
影响范围
此变更主要影响以下API:
Microsoft.JSInterop.JSObjectReference
类型Microsoft.JSInterop.JSInProcessObjectReference
类型
最佳实践建议
- 在JavaScript互操作代码中始终使用接口类型
- 考虑将JavaScript对象引用封装在服务类中,减少直接依赖
- 对于需要长期持有的引用,考虑实现
IDisposable
以确保资源释放 - 在单元测试中,可以方便地模拟这些接口进行测试
总结
这一变更是Blazor框架成熟过程中的一部分,通过使用接口替代具体类,提高了代码的灵活性和可测试性。虽然需要开发者进行一些代码调整,但从长远来看,这种设计更加符合.NET的最佳实践。
docs This repository contains .NET Documentation. 项目地址: https://gitcode.com/gh_mirrors/docs2/docs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考