UWP Mvvm Prism ConfirgureContainer Проблема - PullRequest
0 голосов
/ 06 ноября 2018

Я использую Prism в приложении UWP. Я регистрирую несколько параметров запуска для каждой модели просмотра в

    protected override async void ConfigureContainer()

Я добавил ключевое слово async, потому что я хотел инициализировать некоторые соединения с БД, которые доступны в ConfigureContainer (). Но теперь я замечаю, что приложение запускается (иногда) без установки агентов запуска, что приводит к исключениям null ref. Я не должен инициализировать какие-либо соединения в этом методе? Почему это приложение не ожидает в ConfigureContainer ()? Куда мне поместить вызов метода инициализации Async при запуске приложения? Вот метод.

 protected override async void ConfigureContainer()
    {


        // register a singleton using Container.RegisterType<IInterface, Type>(new ContainerControlledLifetimeManager());
        base.ConfigureContainer();
        Container.RegisterInstance<IResourceLoader>(new ResourceLoaderAdapter(new ResourceLoader()));
        DocumentClient client = new DocumentClient(new Uri("https://docdb.etc/"),
             "my key", new ConnectionPolicy() { ConnectionMode = ConnectionMode.Direct });
        try
        {
            await client.OpenAsync();
        }
        catch (Exception ex)
        {

            throw new Exception("DocumentClient client could not open");
        }
        IDataAccessBM _db = new DataAccessDocDb(client, "ct", "ops");
        AddressSearch addresSearcher = new AddressSearch(_db, 4);
        StartUpArgs startUpArgs = new StartUpArgs
        {
            postCodeApiKey = "anotherKey",
            db = _db,
            fid = "bridge cars",
            dialogService = new DialogService(),
            addressSearcher = addresSearcher
        };
        startUpArgs.zoneSet = await _db.ZoneSetGetActiveAsync("another key");
        Container.RegisterInstance(startUpArgs);
    }

Ответы [ 2 ]

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

Не вводите код инициализации в

 protected override  void ConfigureContainer()

Поместите это в:

 protected override async Task OnInitializeAsync(IActivatedEventArgs args)

Контейнер доступен оттуда и метод асинхронный.

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

Разве я не должен инициализировать какие-либо соединения в этом методе?

Не асинхронно, по крайней мере. Я бы лучше создал ConnectionFactory, который (возможно, асинхронно) создает соединения по требованию.

Почему приложение не ожидает в ConfigureContainer ()?

Потому что нельзя await void. Вот почему использование async void не рекомендуется ... это Task в async Task, то есть await ed, а не async.

Куда следует помещать вызовы методов асинхронной инициализации при запуске приложения?

Нет такой вещи как async конструкторы или async new. Хорошее начало для изучения ваших вариантов здесь это сообщение Стивена Клири .

Container.RegisterInstance<IResourceLoader>(new ResourceLoaderAdapter(new ResourceLoader()));

Регистрация экземпляров уродлива и не нужна в большинстве случаев (это пример). Если вы выполните рефакторинг своего кода, чтобы позволить контейнеру выполнять свою работу, ваша проблема async-initialization исчезнет.

...