1

我需要一個WP8項目和一個Android項目。到目前爲止,我只看到一個名爲Core的PCL,它鏈接到所有平臺項目。問題是,我有平臺特定的參考,我需要包括,取決於平臺。我該如何處理?PCL或克隆項目(MvvmCross)

我也看到了這個:https://github.com/Redth/WshLst。該項目沒有PCL並使用克隆的項目。

我該走哪條路?

回答

2

有兩種方法可以在您聲明的情況下共享代碼。 PCL方法和使用文件鏈接(克隆)。

通過文件鏈接,您通常使用#if指令在您的核心中指定平臺特定功能。像:

#if MONOANDROID 
    var androidGlobal = this.GetService<Cirrious.MvvmCross.Droid.Interfaces.IMvxAndroidGlobals>(); 
    _geo = new Geolocator(androidGlobal.ApplicationContext); 
#else 
    _geo = new Geolocator(); 
#endif 

隨着PCL項目,您通常會創建一個接口,然後創建單獨的平臺的具體實現。

因此,您的PCL核心項目中可能有ILocationWatcher。然後,您可以在每個平臺項目中創建一個WinPhone.LocationWatcherDroid.LocationWatcher

通常您會使用某種控制反轉(IoC)容器在啓動時註冊特定於類型的特定類型。然後你的Core項目會通過依賴注入或者通過IoC容器解析得到一個實例。你的核心PCL將嚴格按照接口進行編程,而不必擔心具體的實現。

這就是MvvmCross插件的工作原理。幾乎所有的插件都有一個核心接口和一個平臺特定的實現。

2

你應該走哪條路取決於你的應用和你的需求。

平臺特定的資源可以使用服務定位和插件技術來注入PCL:

替代地31,可以使用共享具有部分類的代碼,#if

在這個優秀的答案中討論了2種方法的優缺點 - What is the advantage of using portable class libraries instead of using "Add as Link"?