MvvmCross自定义IoC集成打破插件注册



我正在尝试将TinyIoc与MvvmCross集成。我按照……的指示去做https://github.com/MvvmCross/MvvmCross/wiki/Customising-using-App-and-Setup changing-the-ioc-container-that-mvvmcross-uses

并创建一个适配器

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集成,当ViewModel被解析时,IMvxMessenger无法被解析,从而注入了IMvxMessenger函数。我可以看到MessengerPluginBootstrap是由Mvx创建的,但我看不到一个调用是用来注册IMvxMessenger的。

有人知道我做错了什么吗?

每个插件都有一个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容器是否正常工作。

相关内容

  • 没有找到相关文章

最新更新