Xamarin Forms DependencyService with Prism with Autofac crash - 未处理的异常

史蒂夫·兄弟

因此,为了继续我对 Xamarin 的首次尝试,我正在尝试开发一个内容页面,该页面将拍摄照片,然后将照片保存在设备库中以供查看。我正在将 Prism 与 A​​utofac 一起使用,并且我正在关注DependencyService 上wiki 文档GitHub 上提供的示例,但是程序崩溃了,但没有解释原因。

我讨厌那个!

所以,这是我的界面:

   public interface ISavePicture
{
    void SavePictureToGallery(string path);
}

视图模型:

public class PluginPageViewModel : BindableBase
{
    private ISavePicture _savePicture;

    public PluginPageViewModel(ISavePicture savePicture)
    {
        try
        {
            TakePicCommand = new DelegateCommand(TakePicture);
            _savePicture = savePicture;
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex);    
        }

    }

    public  ICommand TakePicCommand { get; private set; }

    private async void TakePicture()
    {
        try
            // Code here for getting the camera to take a picture ...

            _savePicture.SavePictureToGallery(filePath);
        }

        catch (Exception e)
        {
            Debug.WriteLine(e);
            throw;
        }

    }

  }
}

和Android代码:

using Android.App;
using Android.Content;
using Java.IO;
using RolodexDEMO_XF.Droid.Service;
using RolodexDEMO_XF.Services;
using Xamarin.Forms;
using Uri = Android.Net.Uri;

[assembly: Dependency(typeof(SavePicture_Android))]
namespace RolodexDEMO_XF.Droid.Service
{
    public class SavePicture_Android : Activity, ISavePicture
    {
        public void SavePictureToGallery(string path)
        {
            Intent mediaScanIntent = new Intent(Intent.ActionMediaScannerScanFile);
            var file = new File(path);
            Uri contentUri = Uri.FromFile(file);
            mediaScanIntent.SetData(contentUri);
            SendBroadcast(mediaScanIntent);
        }
    }
}

请注意,确实拥有 DependencyService 的程序集属性。我还想指出,我没有使用模拟器来测试它。相反,我使用的是 Galaxy Note 4,因为我正在尝试测试相机。对于那部分,我使用的是 James Montemagno 的 Xamarin.Plugins,而且工作正常。我只是无法保存它,或者查看图片是否确实已保存到设备中。

那么我哪里出错了?

更新:其他人问我在 Android 应用程序中设置了哪些权限,因此在 AndroidManifest.xml 中:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="auto" package="RolodexDEMOXF.RolodexDEMOXF">
    <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="23" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <application android:theme="@style/MyTheme" android:label="Rolodex DEMO">
        <provider android:name="android.support.v4.content.FileProvider" android:authorities="RolodexDEMOXF.fileprovider" android:exported="false" android:grantUriPermissions="true">
            <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"></meta-data>
        </provider>
    </application>
</manifest>

并在 file_paths.xml(在 Resources\xml 目录中)

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="my_images" path="Android/data/RolodexDEMOXF/files/Pictures" />
    <external-path name="my_movies" path="Android/data/RolodexDEMOXF/files/Movies" />
</paths>
史蒂夫·兄弟

我在这里提供答案,以防万一其他人将来遇到和我一样的问题。此外,由于文档很少,我不得不从中国网站(所有地方!)拼凑出这个替代解决方案,并与 Slate Prism-Forms 频道上的一些人讨论,我认为最好将其发布那里有替代解决方案,因此至少您对解决 DependencyService 问题以及使用 Autofac DI 的解决方法有了初步的了解。

我确实想指出,Prism GitHub 上正在讨论 Prism 的 DependencyService 实现应该折旧,并通过我在这篇文章中描述的这个替代方案。所以希望开发团队中的一个人能够记录下来,并就我在这里展示的内容提供更好的代码示例。

也就是说,随着节目...

好的,所以我找到了问题的答案。长话短说,问题在于 Autofac 容器。

现在是冗长的版本。

从我收集到的 Dan Siegel 中,在 Prism 可以为 IoC/DI 容器实现的所有容器中,我不得不选择一个不能很好地与其他容器配合使用的容器!

为什么,我说它玩得不好?根据 Autofac 文档,容器是不可变的,这意味着它一旦构建就无法修改。所以我的假设是,当 Prism 完成项目并尝试添加 DependencyService 的注册类型时,Autofac 会犹豫不决,因为容器已经构建,因此会抛出“未处理的异常”。

这解释了问题,但不是解决方案。

解决办法是什么?好吧,事实证明 Brian (Lagunas) 和 Brian (Noyes) 实现了一个名为 IPlatformInitializer 的新接口,因此我别无选择,只能使用 ContainerBuilder.Update(container) 添加新的 RegisterType,它实现了额外的 RegisterTypes对于 DependencyService,我必须像这样实现它:

public class AndroidInitializer : IPlatformInitializer
{
    public void RegisterTypes(IContainer container)
    {
        var temp = new ContainerBuilder();

        temp.RegisterType<SavePicture_Android>().As<ISavePicture>();
        temp.RegisterType<MessageService_Android>().As<IMessageService>();
        // ... add more RegisterTypes as needed ... 

        temp.Update(container);
    }
}

这个类已经包含在 Prism 模板项目中。对于 Android,它位于 MainActivity.cs 文件中。

以防万一,iOS 和 UWP 是一样的。因此,而不是成为 AndroidInitializer:

  • iOSInitializer : IPlatformInitializer (iOS)(在 AppDelegate.cs 内)
  • UWPInitializer :IPlatformInitializer (UWP)(在 MainPage.xaml.cs 内)

最后一件事:您可以转储 [Assembly Dependency(typeof(X))] 属性,因为它不再需要。但是您仍然需要按照他们在 DependencyService 的文档中所述进行构造函数依赖注入

正如我所说,Prism 团伙正在考虑在 Prism的下一个版本中摆脱他们对 DependencyService 的实现,并沿着我向您解释的这条路线走下去。

值得注意的是,Autofac 上的人也在讨论在Autofac 4 的下一个版本中摆脱 ContainerBuilder.Update()

只是一些公平的警告,因为我在这里放的东西将来可能会消失。

我希望它可以帮助某人!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Xamarin.Forms:使用DependencyService启动活动

来自分类Dev

Xamarin.Forms中具有Autofac的洋葱架构

来自分类Dev

Xamarin.Forms可移植类中的C#DependencyService

来自分类Dev

Xamarin Forms与Prism MasterDetail导航

来自分类Dev

Xamarin.Forms的Prism:来自平台项目的EventAggregator

来自分类Dev

在Xamarin.Android中,需要使用DependencyService通过Xamarin.Forms调用来使用Activity

来自分类Dev

如何使用DependencyService和Interface的委托将xamarin.android特定功能的方法传递给xamarin.forms?

来自分类Dev

Xamarins.Essentials和Xamarin.Forms DependencyService有什么区别

来自分类Dev

Prism Xamarin Forms CustomRenderer导致iOS中的导航问题

来自分类Dev

Xamarin形式:Prism框架FileNotFoundException-Prism.Forms

来自分类Dev

使用Unity在Prism for Xamarin Forms中注册实例以进行导航

来自分类Dev

简单注入器回退到Xamarin Forms DependencyService

来自分类Dev

Xamarin Forms DependencyService nullReferenceException

来自分类Dev

Xamarin.Forms+Prism 导航目标控件

来自分类Dev

Xamarin.Forms,使用 Prism.Forms NavigationService

来自分类Dev

Xamarin Forms 和 Prism,调用 NavigationPage 时出错

来自分类Dev

如何在 Xamarin Forms 的 Prism 中使用 EventToCommandBehavior 获取 ItemTappedEventArgs

来自分类Dev

当我单击 xamarin 中的按钮时,xamarin.forms 发生了未处理的异常

来自分类Dev

Xamarin.Forms WebAPI JsonConverter.DeserializeObject 未处理的异常

来自分类Dev

Xamarin.Forms DependencyService 无法在文件处理中共享跨平台接口

来自分类Dev

事件聚合器未在 Xamarin Forms 的 Prism 7.0 中发布

来自分类Dev

获取 Xamarin Android 中未处理异常的详细异常信息

来自分类Dev

Prism Xamarin Forms 导航服务,DependencyService

来自分类Dev

无法使用 MSTest 和 Prism 设置 Xamarin Forms Unit Test

来自分类Dev

在 Xamarin Forms 中使用 Prism 在 ContentPages 之间导航维护 NavigationParameters

来自分类Dev

无法注册数据服务 Prism Xamarin Forms

来自分类Dev

未处理的异常:Xamarin.Forms.Xaml.XamlParseException:位置 12:21。未找到密钥 FromRTFConverter 的静态资源发生

来自分类Dev

使用 Prism for Xamarin.Forms 创建新项目时出错

来自分类Dev

使用 Xamarin Forms 和 Prism 绑定 SkiaSharp 的 PaintSurface

Related 相关文章

  1. 1

    Xamarin.Forms:使用DependencyService启动活动

  2. 2

    Xamarin.Forms中具有Autofac的洋葱架构

  3. 3

    Xamarin.Forms可移植类中的C#DependencyService

  4. 4

    Xamarin Forms与Prism MasterDetail导航

  5. 5

    Xamarin.Forms的Prism:来自平台项目的EventAggregator

  6. 6

    在Xamarin.Android中,需要使用DependencyService通过Xamarin.Forms调用来使用Activity

  7. 7

    如何使用DependencyService和Interface的委托将xamarin.android特定功能的方法传递给xamarin.forms?

  8. 8

    Xamarins.Essentials和Xamarin.Forms DependencyService有什么区别

  9. 9

    Prism Xamarin Forms CustomRenderer导致iOS中的导航问题

  10. 10

    Xamarin形式:Prism框架FileNotFoundException-Prism.Forms

  11. 11

    使用Unity在Prism for Xamarin Forms中注册实例以进行导航

  12. 12

    简单注入器回退到Xamarin Forms DependencyService

  13. 13

    Xamarin Forms DependencyService nullReferenceException

  14. 14

    Xamarin.Forms+Prism 导航目标控件

  15. 15

    Xamarin.Forms,使用 Prism.Forms NavigationService

  16. 16

    Xamarin Forms 和 Prism,调用 NavigationPage 时出错

  17. 17

    如何在 Xamarin Forms 的 Prism 中使用 EventToCommandBehavior 获取 ItemTappedEventArgs

  18. 18

    当我单击 xamarin 中的按钮时,xamarin.forms 发生了未处理的异常

  19. 19

    Xamarin.Forms WebAPI JsonConverter.DeserializeObject 未处理的异常

  20. 20

    Xamarin.Forms DependencyService 无法在文件处理中共享跨平台接口

  21. 21

    事件聚合器未在 Xamarin Forms 的 Prism 7.0 中发布

  22. 22

    获取 Xamarin Android 中未处理异常的详细异常信息

  23. 23

    Prism Xamarin Forms 导航服务,DependencyService

  24. 24

    无法使用 MSTest 和 Prism 设置 Xamarin Forms Unit Test

  25. 25

    在 Xamarin Forms 中使用 Prism 在 ContentPages 之间导航维护 NavigationParameters

  26. 26

    无法注册数据服务 Prism Xamarin Forms

  27. 27

    未处理的异常:Xamarin.Forms.Xaml.XamlParseException:位置 12:21。未找到密钥 FromRTFConverter 的静态资源发生

  28. 28

    使用 Prism for Xamarin.Forms 创建新项目时出错

  29. 29

    使用 Xamarin Forms 和 Prism 绑定 SkiaSharp 的 PaintSurface

热门标签

归档