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.