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

为何调用DependencyService.Get<T>()会触发App()构造方法?

为什么调用DependencyService.Get()会触发App构造方法?

嘿,这个问题的根源其实就在你的MyReceiver代码里——你直接在里面new了一个App实例:private readonly App app = new App();。咱们来捋一遍整个调用链条,你就明白为什么会触发App构造了:

  1. 当你在MainPage的构造方法里调用DependencyService.Get<IMyService>()时,DependencyService会根据你注册的依赖关系,创建MyService的实例。
  2. MyService初始化的时候,会创建MyReceiver的实例(因为_myReceiver = new MyReceiver();是它的私有字段初始化逻辑)。
  3. 而创建MyReceiver实例的过程中,它的私有字段app会被初始化,也就是执行new App(),这就直接触发了App类的构造方法。

这里要注意,在Xamarin.Forms里,App是整个应用的入口类,框架会自动帮你初始化一次全局的实例。手动new App()会生成一个完全独立的App对象,这不仅会触发构造方法,还可能带来各种奇怪的问题——比如页面导航逻辑混乱、服务实例重复创建等。

给你两个修正方案:

方案1:直接使用MessagingCenter全局发送(推荐)

MessagingCenter本身是全局静态的,不需要传递App实例也能正常工作,修改MyReceiver的代码:

public class MyReceiver : BroadcastReceiver {
    public override void OnReceive(Context context, Intent intent) {
        // 直接发送消息,不需要依赖App实例
        MessagingCenter.Send<object, string>(this, "item", intent.GetStringExtra("item"));
    }
}

方案2:获取当前已存在的App实例

如果你确实需要用到App的实例,不要自己new,而是获取框架已经初始化好的全局实例:

public class MyReceiver : BroadcastReceiver {
    public override void OnReceive(Context context, Intent intent) {
        var currentApp = (App)Application.Current;
        MessagingCenter.Send(currentApp, "item", intent.GetStringExtra("item"));
    }
}

这样修改后,再调用DependencyService.Get<IMyService>()就不会再触发App的构造方法啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 23:57:32