【问题标题】:Add DryIoc adapter for MS DI to Prism DryIoc in xamarin forms以 xamarin 形式将用于 MS DI 的 DryIoc 适配器添加到 Prism DryIoc
【发布时间】:2019-10-06 10:14:18
【问题描述】:

我正在尝试将用于 MS DI 的 DryIoc 适配器添加到 Xamarin.Forms 共享库(.net 标准类库),但我还不能。

当我运行项目时出现此错误

05-20 11:49:29.528 D/ (3402): HostConnection::get() 新主机 连接建立 0xda77ac90,tid 3402 05-20 11:49:29.533 D/Atlas (3402):验证地图...未处理的异常:

System.NullReferenceException:对象引用未设置为实例 一个对象。

05-20 11:50:18.777 D/Mono (3402): DllImport 试图加载: '/system/lib/liblog.so'。 05-20 11:50:18.777 D/单声道(3402): DllImport 加载库 '/system/lib/liblog.so'。 05-20 11:50:18.777 D/Mono(3402):DllImport 搜索:'/system/lib/liblog.so' ('/system/lib/liblog.so')。 05-20 11:50:18.777 D/单声道(3402): 正在搜索“__android_log_print”。 05-20 11:50:18.777 D/单声道 ( 3402):探测“__android_log_print”。 05-20 11:50:18.777 D/单声道 ( 3402):发现为“__android_log_print”。未处理的异常:

System.NullReferenceException:对象引用未设置为实例 一个对象。

05-20 11:50:18.790 I/MonoDroid(3402):未处理的异常:05-20 11:50:18.791 I/MonoDroid(3402):System.NullReferenceException:对象 引用未设置为对象的实例。 05-20 11:50:18.791 I/MonoDroid(3402):在 Prism.Common.PageUtilities.GetCurrentPage (Xamarin.Forms.Page mainPage) [0x00002] 在 D:\a\1\s\Source\Xamarin\Prism.Forms\Common\PageUtilities.cs:212 05-20 11:50:18.791 I/MonoDroid(3402):在 Prism.PrismApplicationBase.OnSleep () [0x00000] 在 D:\a\1\s\Source\Xamarin\Prism.Forms\PrismApplicationBase.cs:193 05-20 11:50:18.791 I/MonoDroid(3402):在 Xamarin.Forms.Application.SendSleep () [0x00000] 在 D:\a\1\s\Xamarin.Forms.Core\Application.cs:297 05-20 11:50:18.791 I/MonoDroid(3402):在 Xamarin.Forms.Platform.Android.FormsAppCompatActivity.OnStateChanged () [0x00057] 在 D:\a\1\s\Xamarin.Forms.Platform.Android\AppCompat\FormsAppCompatActivity.cs:345 05-20 11:50:18.791 I/MonoDroid(3402):在 Xamarin.Forms.Platform.Android.FormsAppCompatActivity.OnStop () [0x00019] 在 D:\a\1\s\Xamarin.Forms.Platform.Android\AppCompat\FormsAppCompatActivity.cs:293 05-20 11:50:18.791 I/MonoDroid(3402):在 Android.App.Activity.n_OnStop (System.IntPtr jnienv, System.IntPtr native__this) [0x00009] 在 :0 05-20 11:50:18.791 I/MonoDroid(3402):在(包装动态方法) Android.Runtime.DynamicMethodNameCounter.15(intptr,intptr) 05-20 11:50:18.806 W/art (3402): JNI RegisterNativeMethods: 尝试 为 android.runtime.JavaProxyThrowable 注册 0 个原生方法

如果我从 MainPageViewModel 的构造函数中删除 IUserSocialService 可以正常工作。不知道为什么不注入IUserSocialService的实现。

服务层

public static IServiceCollection Init()
{
    var serviceCollection = new ServiceCollection();

    serviceCollection.AddSingleton<IUserSocialService, UserSocialService>();
    return serviceCollection;
}

Xamarin.Forms(共享网络标准类库)

protected override IContainerExtension CreateContainerExtension()
{
    var containerExtension = (DryIocContainerExtension)base.CreateContainerExtension();
    containerExtension.Instance.Populate(ServicesLayer.Init());
    return containerExtension; 
}

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

MainPageViewModel

private readonly IUserSocialService userSocialService;

public MainPageViewModel(INavigationService navigationService, IUserSocialService userSocialService) : base(navigationService)
{
    Title = "Main Page";
    this.userSocialService = userSocialService;
}

软件包版本:

服务层:

<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.2.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="2.2.0" />

Xamarin.Forms(共享网络标准类库)

<PackageReference Include="DryIoc.Microsoft.DependencyInjection" Version="2.1.0" />
<PackageReference Include="Prism.DryIoc.Forms" Version="7.1.0.431" />

提前致谢!

【问题讨论】:

  • NRE 消息在没有堆栈跟踪的情况下没有用。可以加吗?
  • @dadhi 我编辑我的答案

标签: c# xamarin.forms dependency-injection prism dryioc


【解决方案1】:

默认情况下,Prism 不支持 Microsoft DI。但是,如果您有此需要,您可能需要尝试Prism.Container.Extensions。该项目有几个可用的助手,包括处理IServiceProviderIServiceCollection 的能力以及一个包,以使使用Microsoft DI 的Shiny 完全无缝。您可以在 GitHub 上找到有关操作方法的更多信息。

【讨论】:

  • MyGet 或 Nuget 上没有为 Prism.Container.Extensions 发布包。我在哪里可以找到它?
  • @MauroPetrini 它还没有在 NuGet 上,可能在本周晚些时候。同时,您可以通过 MyGet 安装它。提要详细信息在自述文件中,并且有一个图表显示可用的最新版本。
  • 如何处理范围服务?例如 IHttpClientFactory 或 services.AddHttpClient()。该软件包不支持范围服务。
  • Prism 通常不直接处理 Scoped 服务。该项目是开源的。随意创建一个问题,我们可以讨论在那里添加它的可能性
猜你喜欢
  • 2018-07-14
  • 2019-04-07
  • 2020-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 2022-12-22
  • 1970-01-01
相关资源
最近更新 更多