如何实现DI服务全局注入?避免组件重复注入相同服务
解决Blazor重复注入常用服务的方案
有两种实用方案可以避免每次都重复编写相同的服务注入代码:
方案1:创建基础组件基类
把所有重复的注入声明封装到一个抽象基类中,后续组件直接继承这个基类,就能自动获取这些服务,无需重复注入。
public abstract class BaseComponent : ComponentBase { [Inject] protected NotificationService NotificationService { get; set; } = default!; [Inject] protected DialogService DialogService { get; set; } = default!; [Inject] protected IJSRuntime JSRuntime { get; set; } = default!; [Inject] protected RegistrationService RegistrationService { get; set; } = default!; [Inject] protected NavigationManager NavigationManager { get; set; } = default!; [Inject] protected LocalStorageService LocalStorageService { get; set; } = default!; }
使用时,组件只需继承基类即可直接调用服务:
@inherits BaseComponent <button @onclick="ShowNotification">弹出通知</button> @code { private void ShowNotification() { NotificationService.Show("这是来自基类的通知"); } }
注:将属性设为protected是为了让子类能访问,default!用于消除nullable上下文的非空警告。
方案2:封装组合服务
把常用服务打包成一个单一的组合服务类,组件只需注入这一个类,就能访问所有内部服务,适合不想用继承、追求低耦合的场景。
首先创建组合服务类:
public class AppCommonServices { public NotificationService NotificationService { get; } public DialogService DialogService { get; } public IJSRuntime JSRuntime { get; } public RegistrationService RegistrationService { get; } public NavigationManager NavigationManager { get; } public LocalStorageService LocalStorageService { get; } public AppCommonServices( NotificationService notificationService, DialogService dialogService, IJSRuntime jsRuntime, RegistrationService registrationService, NavigationManager navigationManager, LocalStorageService localStorageService) { NotificationService = notificationService; DialogService = dialogService; JSRuntime = jsRuntime; RegistrationService = registrationService; NavigationManager = navigationManager; LocalStorageService = localStorageService; } }
然后在Program.cs中注册这个组合服务:
builder.Services.AddScoped<AppCommonServices>();
组件中只需注入一次即可使用所有服务:
@inject AppCommonServices CommonServices <button @onclick="OpenDialog">打开对话框</button> @code { private void OpenDialog() { DialogService.Open("提示", "这是来自组合服务的对话框"); } }
两种方案各有优劣:基类方式更简洁,组件代码少;组合服务方式更灵活,避免了继承耦合,后续调整服务集合也更方便,可根据项目需求选择。
内容的提问来源于stack exchange,提问作者Stan Yurynets
相关产品推荐
相关产品推荐

