MvvmCross Custom IoC Интеграция ломает Регистрация плагинов

Я пытаюсь интегрировать TinyIoc с MvvmCross. Я следовал инструкциям из https://github.com/MvvmCross/MvvmCross/wiki/Customising-using-App-and-Setup

и создал адаптер

public class TinyIoCMvxIoCAdapter : MvxSingleton<IMvxIoCProvider>, IMvxIoCProvider
{
  ...
}

который реализует все методы и перенаправляет их в контейнер TinyIoC. Это было очень прямолинейно, и мне нужно было только внедрить некоторый дополнительный код для запуска обратных вызовов, когда что-то подписывается на

void CallbackWhenRegistered<T>(Action action)
void CallbackWhenRegistered(Type type, Action action)

Я изменил Setup.cs

    protected override IMvxIoCProvider CreateIocProvider()
    {
        var provider = TinyIoCAdapterSetup.CreateIocProvider();
        return provider;
    }

с

 public class TinyIoCAdapterSetup
 {
    public static  IMvxIoCProvider CreateIocProvider()
    {
        var container = TinyIoCContainer.Current;
        container.AutoRegister(t => t == typeof(IMvxViewModel));
        return new TinyIoCMvxIoCAdapter(container);
    }
}

Это все прекрасно работает. Я вижу, что регистр вызывается на TinyIoc, и все также восстанавливается.

Что не работает, так это плагины. Мы используем плагин Messenger и с интеграцией TinyIoC, IMvxMessenger не может быть разрешен при разрешении ViewModel, который вводит ctor IMvxMessenger. Я вижу, что MessengerPluginBootstrap создан Mvx, но я не мог видеть, что был сделан вызов для регистрации IMvxMessenger.

Кто-нибудь знает, что я делаю не так?

1 ответ

Решение

Каждый плагин имеет PluginLoader класс, который Bootstrapper призывает зарегистрировать плагин в контейнере IoC.

Это выглядит примерно так:

public class PluginLoader
    : IMvxPluginLoader
{
    public static readonly PluginLoader Instance = new PluginLoader();

    private bool _loaded;

    public void EnsureLoaded()
    {
        if (_loaded)
        {
            return;
        }

        Mvx.RegisterSingleton<IMvxMessenger>(new MvxMessengerHub());
        _loaded = true;
    }
}

Не видя вашего адаптера IoC, трудно сказать, в чем проблема. Попробуйте вручную зарегистрировать плагин, чтобы увидеть, правильно ли работает контейнер IoC.

Другие вопросы по тегам