在我的 MAUI Blazor 应用程序中,用户可以在运行时注销。当他们这样做时,我基本上想重置所有注入的服务,因此当另一个用户登录时,他们会获得“新鲜”状态,避免可能的错误、不一致和数据泄露。
这是一个我认为应该很常见的问题,但找不到答案。
所以我的问题是:这种方法是否可行?如果可行,如何实现?
如果没有,解决问题的典型方法是什么?
据我了解,MAUI 并不像 ASP.NET Core 那样真正使用 DI 范围。所以我不能在这里使用范围。
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);
}
}