Отменить регистрацию - Viewmodel Prism xamarin dryioc - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть ситуация, когда мне нужно отменить регистрацию модели представления и перерегистрировать ее.

Причина в том, что время от времени я хочу ввести "фальшивый сервис", а не "реальный".

Так что, если я нажимаю кнопку «оффлайн», мне нужно отменить регистрацию моделей представления и перерегистрировать их, чтобы использовать фальшивые сервисы.

Как мне отменить регистрацию модели view-view, используя призму и dryioc

Я обычно регистрируюсь так:

  protected override void RegisterTypes(Prism.Ioc.IContainerRegistry containerRegistry)
{
    containerRegistry.RegisterForNavigation<MyPage,MyPageViewModel>();
}

Как мне отменить регистрацию выше?

спасибо

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

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

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

0 голосов
/ 04 ноября 2018

Причина в том, что время от времени я хочу ввести "фальшивый сервис", а не "реальный".

Нет необходимости отменять регистрацию модели представления. Служба внедряется при создании экземпляра.

Но вам все равно не следует использовать контейнер для этого - вместо этого создайте поставщика услуг, затем вы можете переключить его на активную в данный момент службу. Это даже прозрачно для потребителя, если поставщик услуг реализует сам интерфейс сервиса.

public interface IService
{
    void DoStuff();
}

public interface IServiceProvider
{
    void SetActiveService( Type serviceType );
}

internal ServiceProvider : IServiceProvider, IService
{
    void IService.DoStuff() => _currentService.DoStuff();

    public void SetActiveService( Type serviceType )
    {
        _currentService = _container.Resolve( serviceType );
    }

    private IService _currentService;
}

Добавьте некоторую синхронизацию, обработку ошибок и рефакторинг для ссылки на контейнер для производства.

С Unity я зарегистрировал бы провайдера как неназванную стандартную реализацию и зарегистрировал бы все фактические сервисы как именованные реализации и получил бы IEnumerable<Func<IService>>, внедренный в провайдера услуг. Возможно, DryIoc предлагает аналогичную функциональность.

...