Как реализовать формы Singleton для Xamarin, используя PRISM? - PullRequest
0 голосов
/ 09 апреля 2020

Я работаю над Xamarin.Forms, используя библиотеку PRISM для архитектуры MVVM.

Итак, проблема заключается в том, что всякий раз, когда я перемещаюсь между страницами, используя INavigationService, всегда создается новый экземпляр класса / ViewModel, поэтому уже назначенные строки становятся пустой / нуль. Я регистрирую страницу и ViewModel в App.Xaml.cs, как показано ниже:

protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
    containerRegistry.RegisterForNavigation<LoginPage, LoginViewModel>();
}

Как действовать, чтобы не создавать новые экземпляры всегда или нужно только один раз создавать экземпляры во время работы приложения.

1 Ответ

0 голосов
/ 09 апреля 2020

То, что вы пытаетесь сделать, не поддерживается по разным причинам. Достаточно сказать, что Singleton ViewModel - очень плохая практика и вызывает много проблем. Хотя мы не можем помешать вам зарегистрировать ViewModel в качестве одноэлементного контейнера, это приведет к ошибкам в вашем приложении.

Соответствующие способы

На самом деле вы не предоставили никаких сведений о том, что вы Вы пытаетесь создать экземпляр, но один из этих методов должен работать для вас.

Используйте IInitialize или INavigationAware.OnNavigatedTo

public class LoginViewModel : IInitialize
{
    public void Initialize(INavigationParameters parameters)
    {
        // Initialize anything you need to for the life cycle of your ViewModel here
    }
}

Используйте службу Singleton

public class SomeService : ISomeService
{
    public string Username { get; set; }
}

public partial class App : PrismApplication
{
    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {
        containerRegistry.RegisterForNavigation<LoginPage, LoginViewModel>();
        containerRegistry.RegisterSingleton<ISomeService, SomeService>();
    }
}

public class LoginViewModel
{
    private ISomeService _someService { get; }

    public LoginViewModel(ISomeService someService)
    {
        _someService = someService;
        UserName = _someService.UserName;
    }

    // simplified for example
    public string UserName { get; set; }

    private void DoLogin()
    {
        _someService.UserName = UserName;

    }
}

Я также должен указать, что если вы ищете что-то для одного из после сеанса до следующего запущенного приложения вы можете использовать встроенный IApplicationStore, который предоставляет словарь свойств и SavePropertiesAsyn c из приложения в интерфейсе, обеспечивающем тестируемость вашего кода.

...