bugfix> xamarin > 投稿

私はXamarinとPrismを初めて使用するので、明らかな何かを見落としている場合はご容赦ください。私は次の例をフォローしていますGitHubのこのプロジェクト。ただし、Androidプロジェクトを実行すると、次のエラーが表示されます。

System.InvalidOperationException: The current type, MyApp.Abstractions.IFacebookManager, is an interface and cannot be constructed. Are you missing a type mapping?

エラーは 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 Standard 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 件
  • Xamarin Forms Dependency ServiceとPrism.Unityで提供されるサービスを混合している

    DependencyService.Register<IFacebookManager, FacebookManager>(); を呼び出す代わりに

    AndroidInitializer に登録する必要があります  。

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

    その後、 App.Container.Resolve を呼び出すことにより、常に手動で依存関係を解決できます。  内部 OnActivityResult

  • 同様の問題を解決するのに非常に役立った以前の回答を完了するには: プリズム7では、 IContainerProvider を介して依存関係を解決する必要があります  次のように:

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

    この場合、UnityはIoCの「コンテナー」として使用されます

あなたの答え