ASP.NET Blazor中如何定义全局C#类供各Razor页面分部类调用
Blazor 全局公共类实现方法
你手动new实例不生效,核心原因是Blazor采用内置依赖注入(DI)容器管理服务与组件依赖,手动创建的实例无法自动获取Blazor上下文相关的服务(如NavigationManager、IJSRuntime、身份认证服务等),根据你的公共方法是否依赖外部服务,选对应实现方式即可:
方案1:无依赖静态工具类(最简单)
如果你的通用方法不依赖任何Blazor服务、第三方服务,只是纯逻辑处理(比如格式转换、字符串校验、数值计算),直接定义静态类即可,无需注册也无需实例化,全局可直接调用。
// 可以放在项目根目录的Utils文件夹下 public static class CommonStaticUtils { // 示例:通用手机号脱敏方法 public static string MaskPhone(string phone) { if (string.IsNullOrWhiteSpace(phone) || phone.Length < 11) return phone; return phone.Substring(0,3) + "****" + phone.Substring(7); } }
在任意razor.cs中直接调用:
var masked = CommonStaticUtils.MaskPhone("13800138000");
方案2:带服务依赖的公共类(DI注入方式,推荐)
如果你的通用方法需要用到Blazor内置服务、其他已注册的业务服务,必须走DI注册流程,不要手动new实例,步骤如下:
- 定义公共类,所有依赖通过构造函数声明
public class CommonService { // 声明你需要用到的依赖 private readonly IJSRuntime _jsRuntime; private readonly NavigationManager _navigationManager; // DI容器会自动注入构造函数中要求的服务 public CommonService(IJSRuntime jsRuntime, NavigationManager navigationManager) { _jsRuntime = jsRuntime; _navigationManager = navigationManager; } public async Task CommonJumpTip(string targetUrl) { await _jsRuntime.InvokeVoidAsync("alert", $"即将跳转至{targetUrl}"); _navigationManager.NavigateTo(targetUrl); } }
- 在项目
Program.cs中注册该公共类到DI容器,根据需求选生命周期:
AddTransient:每次调用都生成新实例,适合轻量无状态的工具类AddScoped:同一会话/电路范围内共用一个实例,绝大多数通用场景选这个AddSingleton:整个应用生命周期全局唯一实例,Blazor Server场景下注意不要存储用户专属状态,会被所有用户共享
// 写在var app = builder.Build(); 之前 builder.Services.AddScoped<CommonService>();
- 在任意razor.cs分部类中通过
[Inject]特性注入实例,直接调用方法即可
public partial class TestPage { // 框架自动赋值,无需手动初始化 [Inject] private CommonService CommonHelper { get; set; } = default!; private async Task HandleClick() { // 直接调用方法 await CommonHelper.CommonJumpTip("/index"); } }
注意:不推荐手动new带依赖的公共类,你需要手动传入所有依赖的服务实例,后续新增依赖还要修改所有new的位置,维护成本极高,不符合Blazor的设计规范。
内容的提问来源于stack exchange,提问作者Mdarende
相关产品推荐
相关产品推荐

