我正在嘗試將TinyIoc與MvvmCross集成。我跟着指示從 https://github.com/MvvmCross/MvvmCross/wiki/Customising-using-App-and-Setup#changing-the-ioc-container-that-mvvmcross-usesMvvmCross自定義IoC集成中斷插件註冊
並創建了一個適配器
public class TinyIoCMvxIoCAdapter : MvxSingleton<IMvxIoCProvider>, IMvxIoCProvider
{
...
}
實現所有的方法,並將其轉發到TinyIoC容器。這是很直forwared,我只需要執行一些額外的代碼來觸發回調時得到的東西認購
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。
有人知道我在做什麼錯嗎?
這個答案是點上的錢....插頭bootstrappers依靠'CallbackWhenRegistered'做好自己的工作 - 看https://github.com/MvvmCross/MvvmCross/blob/1ec7bc5f0307595c7ae11f56727dd0e9d2a2262f/CrossCore/Cirrious.CrossCore/ Plugins/MvxPluginBootstrapAction.cs#L17如果沒有'CallbackWhenRegistered',你需要找到另一種方式來做bootstrapping - 可能在每個插件上使用像'EnsureInitialized'這樣的「old skool」技術。 – Stuart
如何/何時註冊IMvxPluginManager? SimpleIoCContainer是否爲所有Mvx類型自動註冊?在Setup.CreatePluginManager被調用之前,我可以看到有什麼東西試圖解析IMvxPluginManager,並且因爲它尚未註冊而失敗。 – step
我修復了我的CallbackWhenRegistered實現,並且一切正常。謝謝你指點我正確的方向。 MvvmCross真棒! – step