You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()获取实例,正确的方式有两种:

  1. 构造函数注入(推荐):在需要使用ILocalize的类中,将其作为构造函数参数声明,MAUI的DI容器会自动完成注入,这是符合DI设计原则的最佳实践:
    public class MyViewModel
    {
        private readonly ILocalize _localize;
    
        // 构造函数注入ILocalize实例
        public MyViewModel(ILocalize localize)
        {
            _localize = localize;
        }
    }
    
  2. 手动从MAUI通用DI容器获取:如果是在无法使用构造函数注入的场景(比如静态方法),可以直接从应用的服务容器中获取:
    // 从全局应用容器获取
    var localize = MauiProgram.Current.Services.GetRequiredService<ILocalize>();
    // 或者在有MauiContext的场景下
    // var localize = mauiContext.Services.GetRequiredService<ILocalize>();
    

内容的提问来源于stack exchange,提问作者Emil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 18:55:57