Xamarin Prism7 - IUnityContainer не имеет зарегистрированных мной типов

Я создаю свое первое мобильное приложение Xamarin (android / iOS) с помощью PRISM. Я следую этому очень полезному руководству https://xamgirl.com/prism-in-xamarin-forms-step-by-step-part-1/

Проблема в том, что IUnityContainer, который вводится в мои модели просмотра, не имеет типов, которые я зарегистрировал в функции RegisterTypes (IContainerRegistry containerRegistry) PrismApplication.

У меня вопрос:

Как мне зарегистрировать свои типы в IUnityContainer, чтобы я мог разрешать их в моей ViewModel?

OR

Как мне получить Контейнер, у которого есть типы, которые я зарегистрировал?

public partial class App : PrismApplication
{
    public App(IPlatformInitializer Initializer) : base (Initializer)  { }

    protected override async void OnInitialized()
    {
        InitializeComponent();

        MainPage = this.Container.Resolve<MainPage>();
    }

    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {
        //I have read that these registrations should not be necessary, however it crashes if I remove them because I inject them into some view models

        containerRegistry.Register<INavigationService, Prism.Navigation.PageNavigationService>();
        containerRegistry.Register<IPageDialogService, Prism.Services.PageDialogService>();
        containerRegistry.Register<IEventAggregator, Prism.Events.EventAggregator>();
        containerRegistry.Register<IUnityContainer, UnityContainer>();

        //Pages
        containerRegistry.RegisterForNavigation<MainPage, MainPageViewModel>();
        containerRegistry.RegisterForNavigation<AboutPage, AboutViewModel>();
        containerRegistry.RegisterForNavigation<ItemDetailPage, ItemDetailViewModel>();
        containerRegistry.RegisterForNavigation<ItemsPage, ItemsViewModel>();
        containerRegistry.RegisterForNavigation<NewItemPage, NewItemViewModel>();
    }
}


public partial class MainPage : MasterDetailPage
{
    public MainPageViewModel Model
    {
        get { return BindingContext as MainPageViewModel; }
        set { BindingContext = value; }
    }

    private IUnityContainer _Container;

    public MainPage(IUnityContainer container, ItemsPage detail, MainPageViewModel model)
    {
        InitializeComponent();
        MasterBehavior = MasterBehavior.Popover;
        Model = model;
        Detail = detail;

        _Container = container;  // I cannot use this container to resolve any of my registered types ???
        // for example, _Container cannot be used to resolve a <ItemsPage> 
    }
}

person Shaboboo    schedule 17.12.2019    source источник
comment
Хотя я не знаком с Xamarin, в приложениях .NET Framework вы не можете получить доступ к контейнеру через DI. Фактически, весь смысл DI в первую очередь в том, что контейнер все связывает за вас. Единственный раз, когда вам нужно ссылаться на него, - это при регистрации. Per stackoverflow.com/questions/49539625/ реестр контейнеров и контейнер - это две разные вещи.   -  person howcheng    schedule 18.12.2019
comment
Я рекомендую вам следовать советам @Mukesh Modhvadiya. как насчет var itemsPage = App.Current.Container.Resolve ‹ItemsPage› ();?   -  person toumir    schedule 19.12.2019


Ответы (1)


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

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

private INavigationService _navigationService;
private IPageDialogService _dialogService;

public MainPageViewModel(INavigationService navigationService, IPageDialogService dialogService)
{
    _navigationService = navigationService;
    _dialogService = dialogService;
}         

Эти сервисы будут разрешены фреймворком и готовы к использованию в вашей ViewModel.

person Mukesh Modhvadiya    schedule 18.12.2019