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

如何在.NET MAUI类库中访问引用项目的类?

解决.NET MAUI类库访问宿主项目类型的问题

类库不能直接依赖引用它的宿主项目(否则会造成循环依赖),你需要通过解耦设计来实现需求,以下是几种可行方案:

1. 依赖注入(推荐,符合SOLID原则)

在类库中定义抽象接口,将宿主项目的具体实现(比如App的MainPage设置逻辑)注入到类库中:

步骤1:类库中定义抽象接口与导航工具类

using Microsoft.Maui.Controls;

// 定义抽象接口,约定设置主页面的行为
public interface IAppNavigationService
{
    void SetMainPage(Page page);
}

// 类库中的导航核心类,依赖抽象接口而非具体宿主类型
public class NavigationHelper
{
    private readonly IAppNavigationService _navigationService;

    public NavigationHelper(IAppNavigationService navigationService)
    {
        _navigationService = navigationService;
    }

    public void NavigateToMainPage(Page targetPage)
    {
        var navPage = new NavigationPage(targetPage);
        _navigationService.SetMainPage(navPage);
    }
}

步骤2:宿主项目实现接口并注入

让你的App类实现上述接口,然后通过MAUI的内置依赖注入系统注册服务:

using Microsoft.Maui.Controls;
using Microsoft.Extensions.DependencyInjection;

public partial class App : Application, IAppNavigationService
{
    public App()
    {
        InitializeComponent();
        
        // 注册服务:将当前App实例作为IAppNavigationService的实现
        var services = new ServiceCollection();
        services.AddSingleton<IAppNavigationService>(this);
        services.AddSingleton<NavigationHelper>();
        // 其他服务注册...
    }

    // 实现接口方法
    public void SetMainPage(Page page)
    {
        MainPage = page;
    }
}

步骤3:宿主项目中使用导航工具

通过依赖注入获取NavigationHelper实例,传入目标页面即可:

// 在宿主页面或ViewModel中
var navHelper = App.Current.Services.GetRequiredService<NavigationHelper>();
navHelper.NavigateToMainPage(new WhateverPage());

2. 传递委托(轻量方案,适合简单场景)

将设置主页面的逻辑包装成委托,传递给类库的导航类,避免直接依赖宿主类型:

类库中的导航类

using Microsoft.Maui.Controls;

public class NavigationHelper
{
    private readonly Action<Page> _setMainPage;

    // 通过构造函数接收设置主页面的委托
    public NavigationHelper(Action<Page> setMainPage)
    {
        _setMainPage = setMainPage;
    }

    public void NavigateToMainPage(Page targetPage)
    {
        var navPage = new NavigationPage(targetPage);
        _setMainPage(navPage);
    }
}

宿主项目中使用

// 实例化导航工具时,传入宿主的主页面设置逻辑
var navHelper = new NavigationHelper(page => App.Current.MainPage = page);
navHelper.NavigateToMainPage(new WhateverPage());

3. 利用MAUI基类(不推荐,耦合度高)

Application.Current是MAUI框架的基类属性,类库只要引用Microsoft.Maui.Controls包就能访问,无需依赖宿主的App子类(因为MainPage是Application基类的属性):

using Microsoft.Maui.Controls;

public class NavigationHelper
{
    public void NavigateToMainPage(Page targetPage)
    {
        var navPage = new NavigationPage(targetPage);
        if (Application.Current != null)
        {
            Application.Current.MainPage = navPage;
        }
    }
}

注意:这种方式直接依赖MAUI框架的全局状态,扩展性差,仅适合临时快速实现。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 10:24:11