Формы Xamarin: Prism — проблема с использованием unity IoC?

#xamarin #xamarin.forms #inversion-of-control #prism

#xamarin #xamarin.формы #инверсия контроля #prism

Вопрос:

Как я должен использовать контейнеры IoC в моем приложении xamarin forms, использующем платформу Prism MVVM? Нет

 Container.Resolve<Interface,Implentation>
  

Я думаю, нам нужно разрешить IoC и инициализировать в app.xaml.cs. Но я не могу найти правильный способ сделать это.
Кто-нибудь может мне помочь?

Обновить:

Страница:

 <?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
        xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
        xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms" 
        prism:ViewModelLocator.AutowireViewModel="True" 
        x:Class="CoC.Core.Views.MenuPage">
    <ContentPage.Content>
            <ListView x:Name="info" 
            SeparatorVisibility="None"
            SeparatorColor="Transparent"
            HasUnevenRows="false"
            RowHeight="50" BackgroundColor="#485366" > 
        <ListView.ItemTemplate> 
                    <DataTemplate>
                        <!--<ImageCell Text="{Binding Title}" ImageSource="{Binding IconSource}" /> -->
                        <ViewCell>
                            <!--<Label Text="{Binding Title}" />-->
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
    </ContentPage.Content>
</ContentPage>
  

ViewModel:

 using Prism.Commands;
using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Collections.ObjectModel;
using Prism.Navigation;

namespace CoC.Core.ViewModels
{
    public class MenuPageViewModel : BindableBase , INavigationAware
    {
        IMenuList _menuList;
        public ObservableCollection<MenuItem> ConductList { get; set; }

        public void OnNavigatedFrom(NavigationParameters parameters)
        {
            //throw new NotImplementedException();
        }

        public void OnNavigatedTo(NavigationParameters parameters)
        {
            //throw new NotImplementedException();
        }  

        public MenuPageViewModel(IMenuList MenuList)
        {
            _menuList = MenuList;
            ConductList = _menuList.GetMenuList();
        }

    }
}
  

ПРИЛОЖЕНИЕ:

 using Prism.Unity;
using CoC.Core.Views;

namespace CoC.Core
{
    public partial class App : PrismApplication
    {
        protected override void OnInitialized()
        {
            InitializeComponent();

            //NavigationService.NavigateAsync("MainPage?title=Hello from Xamarin.Forms");
            NavigationService.NavigateAsync("MenuPage");
        }

        protected override void RegisterTypes()
        {
            Container.RegisterTypeForNavigation<MainPage>();
            Container.RegisterTypeForNavigation<RootPage>();
            Container.RegisterTypeForNavigation<MenuPage>();
        }
    }
}
  

Когда я запускаю этот код, я получаю сообщение об ошибке в Main.cs IOS pro
Ошибка:
Основа.Исключение MonoTouchException
Причина исключения NSInternalLnconistencyException: ожидается, что окно приложения будет иметь корневой контроллер представления в конце приложения.

Комментарии:

1. Установите расширение Visual Studio для пакета шаблонов Prism и с его помощью создайте решение

2. Я сделал. Это не решает проблему

3. Использование контейнера для регистрации вашего интерфейса IMenuList в классе

4. msdn.microsoft.com/en-us/library/ff921149.aspx

5. Я думаю, это для prism в wpf. У вас нет похожих API в Prism MVVM framework для Xamarin.

Ответ №1:

То, что вы ищете, — это метод расширения в Unity. Вам нужно добавить using Microsoft.Practices.Unity пространство имен в ваш файл кода. С помощью которого вы можете зарегистрировать свои сервисы Container.Register<IService,MyService>() .

Комментарии:

1. Я добавил пространство имен. В контейнере Unity нет Register, у него есть функция RegisterType . Итак, я добавил container.RegisterType<IMenu, Menu>(); , но я все еще получаю ту же ошибку.

2. Тогда вы делаете что-то не так. Возможно, проблема где-то еще в вашем коде.