Как разрешить зависимости в Prism + DryIoC - PullRequest
0 голосов
/ 03 июля 2019

Я использую Prism.DryIoc.Forms (7.1.0.431) в одном из моих Xamarin.Forms (4.0.0.497661) проектов.Я столкнулся с проблемой при разрешении зависимости в других классах обслуживания.

Вариант использования:

У нас есть служба RestService, которая занимается сетевыми вызовами, и мы реализовалиеще один сервис под названием ProfileService, в котором мы получаем информацию о пользователе и другие вещи, связанные с сервисом Profile.Я думаю разрешить зависимость RestService в ProfileService для выполнения сетевых вызовов.

Я зарегистрировал обе службы в App.xaml.cs по методу RegisterTypes().

Ответы [ 2 ]

0 голосов
/ 17 июля 2019

Если вы хотите получить доступ к базовому контейнеру, используемому Prism.Forms.В вашем случае DryIoc вы можете легко получить внутри метода RegisterTypes.

protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
   containerRegistry.RegisterForNavigation<NavigationPage>();
   AppContainer = containerRegistry.GetContainer(); //Assigning actual dryioc container
}

AppContainer - это свойство, объявленное в классе App.xaml.cs, как показано ниже.

Примечание: - GetContainerМетод - это метод расширения, доступный в пространстве имен Prism.DryIoc.Импорт пространства имен

using Prism.DryIoc;

//Private and Public variables
public partial class App
{
    /// <summary>
    /// Actual Dry Ioc Container which can be called and used for manual registering and resolving dependencies.
    /// </summary>
    public static IContainer AppContainer { get; set; }
}

Теперь вы можете использовать контейнер DryIoc, как показано ниже.

var authService = App.AppContainer.Resolve<IAuthenticationService>();//you need to register IAuthenticationService inside RegisterType Method.

Примечание: - импортируйте пространство имен DryIoc в ваш класс, в который вы звоните выше линиикода.

using DryIoc;

Happy Coding:)

Примечание: - Приведенный выше подход не рекомендуется, так как это сделает ваш класс /код не проверяется.

0 голосов
/ 03 июля 2019

Я думаю разрешить зависимость RestService в ProfileService для выполнения сетевых вызовов.

Никогда и нигде активно не разрешать что-либо, кроме как один раз в корне приложения.(*)

Что вы хотите сделать, это ввести зависимость, т.е. вы создаете параметр конструктора:

internal class ProfileService : IProfileService
{
    public ProfileService( IRestService restService )
    {
        // store restService for later, use it now... but have it injected, don't resolve it!
    }
}

(*) соглашение о перерегистрациитакие вещи, как ViewModelLocator, являются заметным исключением, но на самом деле, концептуально, мы внедряем универсальную фабрику там больше, чем разрешаем отдельные модели представлений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...