1

我正在尝试将 TinyIoc 与 MvvmCross 集成。我按照 https://github.com/MvvmCross/MvvmCross/wiki/Customising-using-App-and-Setup#sharing-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 ctor 时,无法解析 IMvxMessenger。我可以看到 MessengerPluginBootstrap 是由 Mvx 创建的,但我看不到注册 IMvxMessenger 的调用。

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

4

1 回答 1

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 容器是否正常工作。

于 2014-03-19T12:35:50.847 回答