У меня проблемы с использованием DryIoc для внедрения конструктора в ViewModel с использованием Prism с Xamarin.Я использую пакет Nuget Prism.DryIoc.Forms.
В моем проекте я получаю следующую ошибку в AuthenticatePage.xaml.g.cs
Unable to resolve Object {RequiredServiceType=Project.ViewModels.AuthenticatePageViewModel} with 1 arg(s)
in wrapper Func<Xamarin.Forms.Page, Object> {RequiredServiceType=Project.ViewModels.AuthenticatePageViewModel} with 1 arg(s)
from container
with normal and dynamic registrations:
MainPage, {ID=44, ImplType=Project.Views.MainPage}}
NavigationPage, {ID=43, ImplType=Xamarin.Forms.NavigationPage}}
AuthenticatePage, {ID=45, ImplType=Project.Views.AuthenticatePage}}
В частности, он указывает на строку
private void InitializeComponent() {
global::Xamarin.Forms.Xaml.Extensions.LoadFromXaml(this, typeof(AuthenticatePage));
}
Следует отметить, что если я вызываю следующее в App.OnInitialized, объект разрешается нормально:
c.Register<INegotiator, Negotiator>(Reuse.Singleton);
var n = c.Resolve<INegotiator>();
n.ResumeSessionAsync(); // This works fine, no problems.
await NavigationService.NavigateAsync("NavigationPage/AuthenticatePage"); // Error thrown here
Если я удаляю инъекцию конструктора из моей ViewModel, она работает нормально (Помимо сохранения внедрения по умолчанию навигационной службы, которая работает нормально).Даже попытка внедрить базовый класс, такой как ILogger (без зависимостей), терпит неудачу.
public AuthenticatePageViewModel(INavigationService navigationService, ILogger logger) : base (navigationService)
{
Title = "Authentication Page...";
}
Я собираюсь продолжить расследование, но для кого-то здесь очевидно, что я в принципе делаю что-то не так?Если бы мне пришлось угадывать, я бы сказал, что это связано с конфликтом призм, встроенных в контейнер Ioc и DryIoc?
Редактировать:
Я использую последнюю версиюPrism.DryIoc.Forms доступны на NuGet (7.0.0.396), который говорит, что включает DryIoc 2.12.26.До сих пор я просто следовал шаблону, доступному для Visual Studio, в котором перечислены настройки навигации следующим образом:
protected override async void OnInitialized()
{
InitializeComponent();
var c = new Container();
c.Register<ILogger, LoggerConsole>(Reuse.Singleton);
c.RegisterMany(new[] { Assembly.Load("Project.UWP") },
serviceTypeCondition: type => type == typeof (ILocalFileHandler));
c.Register<INegotiator, Negotiator>(Reuse.Singleton);
// var n = c.Resolve<INegotiator>();
// n.ResumeSessionAsync(); // <- This will run fine. Negotiator class has ILogger and ILocalFileHandler injected into it.
await NavigationService.NavigateAsync("NavigationPage/AuthenticatePage");
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterForNavigation<NavigationPage>();
containerRegistry.RegisterForNavigation<MainPage>();
containerRegistry.RegisterForNavigation<AuthenticatePage>();
}
Я не могу найти в Интернете какую-либо информацию о том, следует ли использовать Prism.DryIoc.DryIocContainerExtensions и как это сделать.настроить навигацию?Даже изменение примера приложения для включения базовой конструкции приводит к ошибке «Значение не может быть пустым» в том же файле xaml.g.cs?