我正在尝试将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容器是否正常工作。