MvvmCross не удалось разрешить тип - PullRequest
0 голосов
/ 08 ноября 2018

Я использую MvvmCross v6.2.1 в проекте iOS и получаю следующее исключение: MvvmCross.Exceptions.MvxIoCResolveException было сгенерировано. Не удалось разрешить тип Countr.Core.Services.IMediaManagerService. В попытке решить эту проблему я добавил код отладки в App.cs

using MvvmCross.IoC;
using Countr.Core.ViewModels;
using Countr.Core.Services;
using MvvmCross;
using MvvmCross.ViewModels;
using System.Linq;

namespace Countr.Core
{
    public class App : MvxApplication
    {
        public override void Initialize()
        {
            CreatableTypes()
                .EndingWith("Service")
                .AsInterfaces()
                .RegisterAsLazySingleton();

            CreatableTypes()
                .EndingWith("Repository")
                .AsInterfaces()
                .RegisterAsLazySingleton();

         var x = new MediaManagerService();
         var y = this.CreatableTypes().FirstOrDefault(t => t.Name == "MediaManagerService");
         var z = Mvx.IoCProvider.Resolve<IMediaManagerService>();

            RegisterAppStart<ArticlesViewModel>();
        }
    }
}

Переменные x и y успешно созданы, т. Е. При создании MediaManagerService не возникает ошибка, а MediaManagerService указан в коллекции CreatableTypes (). Однако код взрывается при инициализации переменной z, т. Е. При выполнении метода Resolve.

Что я делаю не так?

1 Ответ

0 голосов
/ 09 ноября 2018

Проверьте, есть ли у вас более одного MediaManagerService, потому что он может пытаться создать другой экземпляр.

Вместо

var y = this.CreatableTypes().FirstOrDefault(t => t.Name == "MediaManagerService");

проверка

var ylist = this.CreatableTypes().Where(t => t.Name == "MediaManagerService").ToList();

Если у вас все еще есть один случай MediaManagerService, попробуйте зарегистрироваться как

Mvx.IoCProvider.LazyConstructAndRegisterSingleton<IMediaManagerService, MediaManagerService>();

Если у вас есть более одного вхождения реализации, то вы можете сделать вышеупомянутое решение для одного вхождения после регистрации CreatableTypes, так что оно отменяет предыдущую регистрацию или вы можете просто изменить имя интерфейса / реализации так что сканирование дает вам уникальную пару интерфейса / реализации для регистрации.

...