2013-01-15 84 views
4

我正在給MVVMCross一個旋轉,看看它是否會用於一些更大的項目,而且非常棒。我喜歡導航,viewModel位置和一般的跨平臺方法,這正是我所需要的。但是,根據平臺的不同,我有點被分裂出一些依賴注入。MVVMCross中特定於平臺的IoC

所以,我們有基本的應用程序,具有共享移植庫,啓動時初始化的服務引用:

public TwitterSearchApp() 
    { 
     InitaliseServices(); 
    } 

    private void InitaliseServices() 
    { 
     this.RegisterServiceInstance<ITwitterSearchProvider>(new TwitterSearchProvider()); 
    } 

精細。這定義了將在所有平臺上使用的服務實現。但是,在不同平臺上需要不同實現的情況又如何?例如,可能存儲/緩存,其核心要求是相同的,但需要在手機上而不是在平板電腦上處理。

我想這可能在安裝程序中去的地方:

public class Setup : MvxBaseWinRTSetup 
    { 
     public Setup(Frame rootFrame): base(rootFrame) 
     { 
     } 

     protected override MvxApplication CreateApp() 
     { 
      var app = new TwitterSearchApp();//set platorm specific IoC here maybe? 
      return app; 
     } 

     protected override void AddPluginsLoaders(Cirrious.MvvmCross.Platform.MvxLoaderPluginRegistry loaders) 
     { // or perhaps here? 
      loaders.AddConventionalPlugin<Cirrious.MvvmCross.Plugins.Visibility.WinRT.Plugin>(); 
      base.AddPluginsLoaders(loaders); 
     } 
    } 

,但我不知道。我已經看到了替換ViewModel定位器的引用,但是是否有類似的方法來替換其他IoC服務?

感謝,對一般框架偉大的工作,我真的很喜歡它是如何工作的(除了這一點,我不明白正確尚)

託比

+0

HMM ,也許是一個PlugIn然後:http:// stackoverflow。com/questions/12564272/making-mono-cross-platform-support-for-task-intent – TobyEvans

回答

7

有三個基本選項:

。在你的UI項目中添加特定於平臺的服務,然後在安裝過程中將它們註冊到一個覆蓋中 - 你使用的覆蓋取決於你的服務何時需要,但是在大多數情況下,你可以使用在初始化結束時被調用的覆蓋:

protected override void InitializeLastChance() 
{ 
    this.RegisterServiceInstance<IMyService>(new SingletonMyService()); 
    this.RegisterServiceType<IMyService2, PerCallService2>(); 
    base.InitialiseLastChance(); 
} 

如果「最後一次機會」是太晚爲您服務 - 如果你需要的核心應用程序啓動時的服務 - 那麼你可以InitializeIoC後覆蓋任何初始化步驟 - 如InitializeFirstChance。對於初始化步驟列表和順序,請參閱InitializePrimaryInitializeSecondaryMvxBaseSetup.cs

。在UI代碼的其他位添加特定於平臺的註冊 - 例如在構造函數中的一個特定視圖(此選項不使用多...但你可以在一些奇怪的情況下使用它,如果你想...)

。使用插件 - 所有插件都是IoC的封裝。插件的缺點是它們增加了一些開發開銷(你必須添加單獨的項目和插件樣板文件),但是它們的優點是可以跨應用程序重複使用,並且爲它們編寫測試應用程序和測試工具更容易。有關插件的詳細信息,請參閱Making mono cross platform support for Task/Intenthttp://slodge.blogspot.co.uk/2012/10/build-new-plugin-for-mvvmcrosss.html


我一般建議 - 先從第一個選項,遷移出來一個插件,如果你想重用在以後的項目代碼...

+0

Hi Stuart - 我試過類似的東西,但this.RegisterServiceInstance 在我的Setup類中似乎不可用,只有在便攜式應用程序 - 我可能缺少擴展方法?現在試驗...... – TobyEvans

+0

會是「使用Cirrious.MvvmCross.ExtensionMethods;」在任何情況下? – TobyEvans

+0

它們只是靜態方法的一個包裝。對不起,我是Resharper用戶,它只是爲我找到使用語句! – Stuart

相關問題