如何在.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
相关产品推荐
相关产品推荐

