MAUI中builder.Services.Add与DependencyService.Register的区别及实例获取问题
MAUI两种依赖注入注册方式的区别及问题解答
核心区别
builder.Services.AddSingleton<ILocalize, Localize>():这是.NET生态通用的依赖注入(DI)容器注册方式,是MAUI官方推荐的现代DI方案。所有注册到这里的服务,都属于MAUI基于ASP.NET Core构建的全局DI容器,支持构造函数注入、生命周期管理等标准DI特性。DependencyService.Register<ILocalize, Localize>():这是从Xamarin继承来的旧版服务定位器机制,是MAUI为兼容旧项目保留的特性。它有自己独立的服务存储容器,和上面的通用DI容器完全隔离,彼此不共享任何注册的服务。
为什么第一种注册后用DependencyService.Get<ILocalize>()会返回null
是的,二者使用完全独立的容器。DependencyService.Get()只会从它自己的专属容器里查找服务,而你用builder.Services.AddSingleton()注册的服务在通用DI容器里,所以查不到,返回null。
用第一种注册方式时,如何正确获取实例
如果你想一直使用builder.Services.AddSingleton()这种推荐方式,不能用DependencyService.Get()获取实例,正确的方式有两种:
- 构造函数注入(推荐):在需要使用
ILocalize的类中,将其作为构造函数参数声明,MAUI的DI容器会自动完成注入,这是符合DI设计原则的最佳实践:public class MyViewModel { private readonly ILocalize _localize; // 构造函数注入ILocalize实例 public MyViewModel(ILocalize localize) { _localize = localize; } } - 手动从MAUI通用DI容器获取:如果是在无法使用构造函数注入的场景(比如静态方法),可以直接从应用的服务容器中获取:
// 从全局应用容器获取 var localize = MauiProgram.Current.Services.GetRequiredService<ILocalize>(); // 或者在有MauiContext的场景下 // var localize = mauiContext.Services.GetRequiredService<ILocalize>();
内容的提问来源于stack exchange,提问作者Emil
相关产品推荐
相关产品推荐

