如何在 MAUI 中重置所有 DI 服务或用户注销时的 DI 范围?

问题描述 投票:0回答:1

在我的 MAUI Blazor 应用程序中,用户可以在运行时注销。当他们这样做时,我基本上想重置所有注入的服务,因此当另一个用户登录时,他们会获得“新鲜”状态,避免可能的错误、不一致和数据泄露。

这是一个我认为应该很常见的问题,但找不到答案。
所以我的问题是:这种方法是否可行?如果可行,如何实现?
如果没有,解决问题的典型方法是什么?

据我了解,MAUI 并不像 ASP.NET Core 那样真正使用 DI 范围。所以我不能在这里使用范围。

c# .net dependency-injection maui
1个回答
0
投票

Shell 正在重用视图和视图模型。一种方法是重置页面和/或数据上下文作为导航。这是一个例子:

您需要一些具有重置对象方法的接口:

public interface IResettable
{
    void Reset();
}

您可以根据需要在视图中实现此功能,以重置焦点、显示键盘等。

public partial class SignInPage : IResettable
{
    public void Reset()
    {
        userName.Focus();
    }
}

您可以在视图模型中实现此功能,以通过重置绑定变量来清除以前加载的数据。

public partial class SignInViewModel : ObservableObject, IResettable
{
    public void Reset()
    {
        UserName = null;
        Password = null;
    }
}

最后,您需要挂接到 Shell 导航中,以便在导航过程中自动执行此操作。

protected override void OnNavigated(ShellNavigatedEventArgs args)
{
    base.OnNavigated(args);
    _logger.ShellNavigated(args);

    // Support resetting the View first.
    try
    {
        if (Current.CurrentPage is IResettable resettable)
        {
            MainThread.BeginInvokeOnMainThread(resettable.Reset);
        }
    }
    catch (Exception ex)
    {
        _logger.FailedToResetView(ex);
    }

    // Support resetting the BindingContext after the view.
    try
    {
        if (Current.CurrentPage?.BindingContext is IResettable resettableBindingContext)
        {
            MainThread.BeginInvokeOnMainThread(resettableBindingContext.Reset);
        }
    }
    catch (Exception ex)
    {
        _logger.FailedToResetBindingContext(ex);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.