2014-03-19 27 views
1

我正在嘗試將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。

有人知道我在做什麼錯嗎?

回答

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

+0

這個答案是點上的錢....插頭bootstrappers依靠'CallbackWhenRegistered'做好自己的工作 - 看https://github.com/MvvmCross/MvvmCross/blob/1ec7bc5f0307595c7ae11f56727dd0e9d2a2262f/CrossCore/Cirrious.CrossCore/ Plugins/MvxPluginBootstrapAction.cs#L17如果沒有'CallbackWhenRegistered',你需要找到另一種方式來做bootstrapping - 可能在每個插件上使用像'EnsureInitialized'這樣的「old skool」技術。 – Stuart

+0

如何/何時註冊IMvxPluginManager? SimpleIoCContainer是否爲所有Mvx類型自動註冊?在Setup.CreatePluginManager被調用之前,我可以看到有什麼東西試圖解析IMvxPluginManager,並且因爲它尚未註冊而失敗。 – step

+0

我修復了我的CallbackWhenRegistered實現,並且一切正常。謝謝你指點我正確的方向。 MvvmCross真棒! – step