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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:54:14