DryIoc - переключение между фальшивой и реальной реализацией сервиса (Xamarin Forms) VS2017 - PullRequest
0 голосов
/ 24 ноября 2018

У меня есть ситуация, когда я хочу переключаться между «FakeService» и «RealService» во время выполнения.

MyViewModel

    public class BookingViewModel 
    {
        private readonly IBookingService bookingService;

        public WelcomePageViewModel(
            INavigationService navigationService,IBookingService bookingService)
        {
            this.bookingService= bookingService;
        }
     }

В моем App.xaml я делаю следующее:

    private IContainer container;
    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {
        container = containerRegistry.GetContainer();

        RegisterRealServices()
    }

    private void RegisterRealServices()
    {
        container.Register<IBookingService, RealBookingService>(Reuse.Singleton);
    }

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

Однако то, что я сделал ниже, не делаетпохоже, работает, потому что я продолжаю перенаправляться на «RealBookingService», а не на «FakeBookingService»

Как я могу это сделать?

    private void RegisterFakeServices()
    {
        container.Unregister<IBookingService>();

        container.Register<IBookingService,FakeBookingService>(
            Reuse.Singleton,
            ifAlreadyRegistered: IfAlreadyRegistered.Replace);
    }

Вопрос: можно ли переключить реализацию службыво время выполнения?Как вы делаете это с помощью DryIoc?

Ответы [ 2 ]

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

Вы должны предотвратить удаление или замену регистраций из своего контейнера, как только вы использовали его для разрешения экземпляров из - что приводит к сложностям и может привести к очень тонким, трудно отслеживаемым ошибкам, как в обоих случаях, так испособ построения их графов объектов может быть кэширован в контейнере DI.Вы должны предпочесть держать свои графы объектов фиксированными, таким образом не изменяя форму графиков во время выполнения.

Решение состоит в том, чтобы создать новую IBookingService сервивную реализацию, которая зависит как от FakeBookingService, так и от RealBookingServiceи перенаправляет входящие вызовы на один из них, основываясь на информации времени выполнения (ваш переключатель)Это реализация шаблона Proxy:

public class BookingServiceSelectorProxy : IBookingService
{
    private readonly FakeBookingService fake;
    private readonly RealBookingService real;
    public BookingServiceSelectorProxy(FakeBookingService fake, RealBookingService real) {
        this.fake = fake;
        this.real = real;
    }

    private IBookingService BookingService => 
        /* return fake or real based on your runtime switch */

    // All methods dispatch to one of the wrapped repositories
    public void CompleteBooking(CompleteBookingRequest request)
        => this.BookingService.CompleteBooking(request);

    public void CancelBooking(CancelBookingRequest request)
        => this.BookingService.CancelBooking(request);
}
0 голосов
/ 24 ноября 2018

Я не эксперт по Xamarin, но для (пере) регистрации в DryIoc требуется специальная подготовка (особенно для синглтона).Это потому, что создание сервиса может быть уже кэшировано.

Вот вики, объясняющая это подробно: https://bitbucket.org/dadhi/dryioc/wiki/UnregisterAndResolutionCache

...