Добавить адаптер DryIoc для MS DI в Prism DryIoc в форме ксамарина - PullRequest
1 голос
/ 20 мая 2019

Я пытаюсь добавить адаптер DryIoc для MS DI в общую библиотеку 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 / Mono (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 / Mono (3402): поиск «__android_log_print».05-20 11: 50: 18.777 D / Mono (3402): проверка «__android_log_print».05-20 11: 50: 18.777 D / Mono (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] в <788a34f7a7b84486905dfde786529d42>: 0 05-20 11: 50: 18.791 I / MonoDroid (3402): в (динамический метод-оболочка) Android.Runtime.DynamicMethodNameCounter.15 (intptr, intptr) 05 (intptr, intptr): 50: 18.806 W / art (3402): JNI RegisterNativeMethods: попытка зарегистрировать 0 собственных методов для android.runtime.JavaProxyThrowable

Если я удаляю IUserSocialService из конструктора MainPageViewModel, то работает нормально.Я не знаю, почему не внедряется реализация IUserSocialService.

ServiceLayer

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 (общая стандартная библиотека классов net)

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

Заранее спасибо!

1 Ответ

1 голос
/ 20 мая 2019

По умолчанию Prism не поддерживает Microsoft DI. Однако, если это необходимо, вы можете попробовать Prism.Container.Extensions . В этом проекте доступно несколько помощников, в том числе возможность работать с IServiceProvider и IServiceCollection, а также пакет, позволяющий работать с Shiny, полностью использующим Microsoft DI. Вы можете узнать больше о том, как на GitHub.

...