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

时间:2014-03-19 12:09:20

标签: mvvmcross tinyioc

我正在尝试将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集成,当解析了注入了IMvxMessenger ctor的ViewModel时,无法解析IMvxMessenger。我可以看到MessengerPluginBootstrap是由Mvx创建的,但是我看不到调用IMvxMessenger的调用。

有人知道我做错了吗?

1 个答案:

答案 0 :(得分:3)

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