Xamarin.Forms 已經有一個內建的 DI Library 叫 DependencyService
,它提供了簡單註冊及解析的方法,如果我們的使用情境並不複雜,DependencyService 就已經能夠滿足我們絕大部分的需求,有需要的時候再考慮去引用像 Unity 或 Autofac 這種能夠提供更彈性的註冊及解析方法的 Library,底下我就用取得 Android 及 iOS 設備平台識別碼的範例來簡單說明 DependencyService 如何使用。
需要一個介面(或抽象類別)
取得 Android 或 iOS 設備平台識別碼必須回到各自的平台去處理,Android 有 Android 的寫法,iOS 有 iOS 的寫法,我們必須定義一個統一的介面,讓 Android 及 iOS 專案各自去實作這個介面,暫時給這個介面一個名字叫 IDeviceService
,裡面有一個 GetDeviceId()
的方法給各個平台自個兒去實作。
public interface IDeviceService
{
string GetDeviceId();
}
Android 專案實作 IDeviceService 介面
取得 Android 及 iOS 設備平台識別碼的 Sample Code 可以參考這篇文章,我們先照抄著做。
public class AndroidDeviceService : IDeviceService
{
public string GetDeviceId()
{
return Android.ProviderSettings.Secure.GetString(Android.AppApplication.Context.ContentResolver, Android.ProviderSettings.Secure.AndroidId);
}
}
iOS 專案實作 IDeviceService 介面
iOS 的需要多引用 IOKit Framework
public class IOSDeviceService : IDeviceService
{
public string GetDeviceId()
{
return UIKit.UIDevice.CurrentDevice.IdentifierForVendor.AsString();
}
}
註冊 IDeviceService 的實作類別
有兩種方式可以註冊實作類別,一種是用 Xamarin.Forms.Dependency(Type implementorType) 方法,一種是用 DependencyService.Register
Xamarin.Forms.Dependency()
在 Android 或 iOS 專案中任一個 namespace 以外的位置加入 [assembly: Xamarin.Forms.Dependency(typeof(xxx))]
DependencyService.Register()
在 Android 或 iOS App 的進入點呼叫 DependencyService.Register<xxx>()
使用 DependencyService.Get() 取得對應註冊的實作
我們在 Xamarin.Forms 的專案中要依各平台去取得對應註冊的實作就用 DependencyService.Get<IDeviceService>()
就可以了,Android 平台就會用 AndroidDeviceService 類別,iOS 平台就會用 IOSDeviceService 類別。
如果我們還不知道 IoC、DI、DIP 這些跟物件依賴的相關名詞及相關的工具,是時候應該要去了解一下了。