如何在AuthHelper中获取当前FreshMVVM PageModel的CoreMethods
解决FreshMVVM中AuthHelper直接获取CoreMethods的方案
我完全理解你的痛点——每次在AuthHelper的方法里手动传入CoreMethods确实有点繁琐,尤其是当多个导航操作都需要用到的时候。下面给你几个实用的方案,帮你简化这个流程:
方案一:直接依赖FreshMVVM的导航服务(推荐)
其实FreshMVVM本身提供了IFreshNavigationService来处理页面导航,完全可以替代CoreMethods的导航功能,这样你的AuthHelper就不用再依赖CoreMethods了,更符合单一职责原则。
public class AuthHelper { private readonly IFreshNavigationService _navigationService; // 通过构造函数注入导航服务 public AuthHelper(IFreshNavigationService navigationService) { _navigationService = navigationService; } public async Task NavigateToHomeAfterAuthSuccess() { // 直接用导航服务执行push操作 await _navigationService.PushPageAsync<HomePageModel>(); } public async Task GoBackToLoginOnAuthFailure() { // 执行pop操作返回上一页 await _navigationService.PopPageAsync(); } public async Task ResetToLoginOnLogout() { // 直接回到根页面 await _navigationService.PopToRootPageAsync(); } }
这个方案的好处是:不需要和PageModel的CoreMethods耦合,导航逻辑完全由FreshMVVM的内置服务处理,代码更干净也更易维护。
方案二:通过静态类持有当前CoreMethods
如果你确实需要直接使用CoreMethods的其他功能,可以在页面初始化时把当前的CoreMethods实例保存到一个静态类中,后续AuthHelper直接取用即可。
1. 创建静态持有者类
public static class CoreMethodsHolder { public static ICoreMethods Current { get; set; } }
2. 在PageModel基类中更新实例
如果你的项目有自定义的BasePageModel,可以在初始化和销毁时维护这个静态实例:
public class BasePageModel : FreshBasePageModel { public override void Init(object initData) { base.Init(initData); // 页面初始化时保存当前CoreMethods CoreMethodsHolder.Current = CoreMethods; } public override void Dispose(bool disposing) { if (disposing) { // 页面销毁时清空,避免内存泄漏 if (CoreMethodsHolder.Current == CoreMethods) { CoreMethodsHolder.Current = null; } } base.Dispose(disposing); } }
3. 在AuthHelper中直接使用
public class AuthHelper { public async Task NavigateToDashboard() { var coreMethods = CoreMethodsHolder.Current; if (coreMethods != null) { await coreMethods.PushPageModel<DashboardPageModel>(); } } }
注意:静态类的方式虽然简单,但要注意内存泄漏问题,一定要在页面销毁时清空实例。
方案三:通过依赖注入提供当前CoreMethods(更优雅)
如果你的项目使用了依赖注入,可以定义一个专门的服务来管理当前的CoreMethods实例,比静态类更易测试和维护。
1. 定义接口和实现类
public interface ICurrentCoreMethodsProvider { ICoreMethods GetCurrent(); void SetCurrent(ICoreMethods coreMethods); } public class CurrentCoreMethodsProvider : ICurrentCoreMethodsProvider { private ICoreMethods _currentCoreMethods; public ICoreMethods GetCurrent() { return _currentCoreMethods; } public void SetCurrent(ICoreMethods coreMethods) { _currentCoreMethods = coreMethods; } }
2. 在DI容器中注册服务
在你的启动类(比如App.xaml.cs)中注册这个服务为Scoped实例:
services.AddScoped<ICurrentCoreMethodsProvider, CurrentCoreMethodsProvider>();
3. 在BasePageModel中绑定实例
public class BasePageModel : FreshBasePageModel { private readonly ICurrentCoreMethodsProvider _coreMethodsProvider; public BasePageModel(ICurrentCoreMethodsProvider coreMethodsProvider) { _coreMethodsProvider = coreMethodsProvider; } public override void Init(object initData) { base.Init(initData); _coreMethodsProvider.SetCurrent(CoreMethods); } public override void Dispose(bool disposing) { if (disposing) { _coreMethodsProvider.SetCurrent(null); } base.Dispose(disposing); } }
4. 在AuthHelper中注入使用
public class AuthHelper { private readonly ICurrentCoreMethodsProvider _coreMethodsProvider; public AuthHelper(ICurrentCoreMethodsProvider coreMethodsProvider) { _coreMethodsProvider = coreMethodsProvider; } public async Task HandlePostAuthNavigation() { var coreMethods = _coreMethodsProvider.GetCurrent(); if (coreMethods != null) { await coreMethods.PushPageModel<MainPageModel>(); } } }
这个方案更符合依赖注入的设计思想,代码的可测试性和扩展性更好,适合中大型项目使用。
内容的提问来源于stack exchange,提问作者hytea
相关产品推荐
相关产品推荐

