并行类和共享资产项目
虽然共享资产项目是平台项目的扩展,但这种关系是双向的:正如平台项目可以调用共享资产项目中的代码一样,SAP可以调用各个平台项目。
这意味着我们可以将特定于平台的API调用限制为各个平台项目中的类。 如果平台项目中这些类的名称和名称空间相同,那么SAP中的代码可以透明,独立于平台的方式访问这些类。
在PlatInfoSap2解决方案中,五个平台项目中的每一个都有一个名为PlatformInfo的类,它包含两个返回字符串对象的方法,名为GetModel和GetVersion。 这是iOS项目中此类的版本:
using System;
using UIKit;
namespace PlatInfoSap2
{
public class PlatformInfo
{
UIDevice device = new UIDevice();
public string GetModel()
{
return device.Model.ToString();
}
public string GetVersion()
{
return String.Format("{0} {1}", device.SystemName,
device.SystemVersion);
}
}
}
注意命名空间名称。 虽然此iOS项目中的其他类使用PlatInfoSap2.iOS命名空间,但此类的命名空间仅为PlatInfoSap2。 这允许SAP直接访问此类,而无需任何平台细节。
这是Android项目中的并行类。 相同的命名空间,相同的类名和相同的方法名,但使用Android API调用的这些方法的不同实现:
using System;
using Android.OS;
namespace PlatInfoSap2
{
public class PlatformInfo
{
public string GetModel()
{
return String.Format("{0} {1}", Build.Manufacturer,
Build.Model);
}
public string GetVersion()
{
return Build.VERSION.Release.ToString();
}
}
}
这是三个Windows和Windows Phone项目中三个相同副本中存在的类:
using System;
using Windows.Security.ExchangeActiveSyncProvisioning;
namespace PlatInfoSap2
{
public class PlatformInfo
{
EasClientDeviceInformation devInfo = new EasClientDeviceInformation();
public string GetModel()
{
return String.Format("{0} {1}", devInfo.SystemManufacturer,
devInfo.SystemProductName);
}
public string GetVersion()
{
return devInfo.OperatingSystem;
}
}
}
PlatInfoSap2项目中的XAML文件与PlatInfoSap1项目中的XAML文件基本相同。 代码隐藏文件相当简单:
using System;
using Xamarin.Forms;
namespace PlatInfoSap2
{
public partial class PlatInfoSap2Page : ContentPage
{
public PlatInfoSap2Page ()
{
InitializeComponent ();
PlatformInfo platformInfo = new PlatformInfo();
modelLabel.Text = platformInfo.GetModel();
versionLabel.Text = platformInfo.GetVersion();
}
}
}
该类引用的PlatformInfo的特定版本是已编译项目中的特定版本。 这几乎就像我们为Xamarin.Forms定义了一个小扩展,它存在于各个平台项目中。