Призма с Xamarin для Android - InvalidOperationException при запуске - PullRequest
0 голосов
/ 25 мая 2018

Я новичок в Xamarin и Prism, так что прости меня, если я упускаю что-то очевидное.Я следую примеру этого проекта в GitHub .Однако я получаю следующую ошибку при запуске моего проекта Android.

System.InvalidOperationException: Текущий тип, MyApp.Abstractions.IFacebookManager, является интерфейсом и не может быть создан.Вам не хватает отображения типов?

Ошибка возникает в EntryPage.xaml.g.cs в методе LoadFromXaml().

[global::Xamarin.Forms.Xaml.XamlFilePathAttribute("Views\\EntryPage.xaml")]
public partial class EntryPage : global::Xamarin.Forms.ContentPage {

    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Forms.Build.Tasks.XamlG", "2.0.0.0")]
    private void InitializeComponent() {
        // Exception thrown here!
        global::Xamarin.Forms.Xaml.Extensions.LoadFromXaml(this, typeof(EntryPage));
    }
}

Это заставляет меня поверить, что я неправильно использую контейнер IoC, но я не вижу, что делаю иначе, чем в примере.Конструктор EntryPageViewModel принимает IFacebookManager в качестве параметра, и я понимаю, что Unity должна позаботиться об этом.У меня есть точка останова на конструкторе, но это не ударил.Это стандартное решение .NET Xamarin.Буду признателен за любую помощь и руководство.Спасибо!

Вот мой App.xaml.cs

using MyApp.Abstractions;
using MyApp.Helpers;
using MyApp.Services;
using MyApp.ViewModels;
using MyApp.Views;
using Prism;
using Prism.Ioc;
using Prism.Unity;

using Xamarin.Forms;

namespace MyApp
{
    public partial class App : PrismApplication
    {
        public App(IPlatformInitializer initializer = null) : base(initializer) { }


        protected override void OnInitialized()
        {
            InitializeComponent();

            ServiceResolver.Instance.Add<ICloudService, AzureCloudService>();

            NavigationService.NavigateAsync("NavigationPage/EntryPage");            
        }



        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
            containerRegistry.RegisterForNavigation<NavigationPage>();
            containerRegistry.RegisterForNavigation<EntryPage, EntryPageViewModel>();
        }
    }
}

Вот мой MainActivity.cs

using Android.App;
using Android.Content.PM;
using Android.OS;
using MyApp.Droid.Services;
using MyApp.Abstractions;
using Android.Content;
using Xamarin.Facebook;
using Xamarin.Forms;
using Prism;
using Prism.Ioc;

namespace MyApp.Droid
{
    [Activity(Label = "MyApp", Icon = "@drawable/icon", Theme = "@style/MainTheme", Name = "com.mydomain.myapp.MainActivity", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        ICallbackManager fbCallbackManager;
        AndroidLoginProvider loginProvider;

        protected override void OnCreate(Bundle bundle)
        {
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;
            base.OnCreate(bundle);
            Microsoft.WindowsAzure.MobileServices.CurrentPlatform.Init();                        
            global::Xamarin.Forms.Forms.Init(this, bundle);
            DependencyService.Register<IFacebookManager, FacebookManager>();

            LoadApplication(new App(new AndroidInitializer()));
        }

        protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
        {
            base.OnActivityResult(requestCode, resultCode, data);

            var manager = DependencyService.Get<IFacebookManager>();
            if (manager != null)
            {
                (manager as FacebookManager)._callbackManager.OnActivityResult(requestCode, (int)resultCode, data);
            }
        }
    }

    public class AndroidInitializer : IPlatformInitializer
    {
        public void RegisterTypes(IContainerRegistry containerRegistry)
        {
        }
    }
}



public class AndroidInitializer : IPlatformInitializer
{
    public void RegisterTypes(IContainerRegistry containerRegistry)
    {
    }
}

Ответы [ 2 ]

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

Чтобы завершить предыдущий ответ, который мне очень помог решить аналогичную проблему: с помощью призмы 7 необходимо разрешить зависимость с помощью IContainerProvider следующим образом:

var container = (App.Current as Prism.Unity.PrismApplication).Container;
var manager = container.Resolve<IFacebookManager>();

В этом случае Unityиспользуется как контейнер IoC

0 голосов
/ 25 мая 2018

Вы смешиваете формы Xamarin Служба зависимостей с услугой, предоставляемой с Prism.Unity

Вместо вызова DependencyService.Register<IFacebookManager, FacebookManager>();

Вынеобходимо зарегистрировать его с помощью AndroidInitializer.

public class AndroidInitializer : IPlatformInitializer
{
    public void RegisterTypes(IContainerRegistry container)
    {
        container.RegisterSingleton<IFacebookManager, FacebookManager>();
    }
}

Затем вы всегда можете разрешить зависимость вручную, вызвав App.Container.Resolve внутри OnActivityResult.

...