[食譜好菜] Xamarin.Forms 內建的 DI Library - DependencyService

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 這些跟物件依賴的相關名詞及相關的工具,是時候應該要去了解一下了。

參考資料

C# 指南 ASP.NET 教學 ASP.NET MVC 指引
Azure SQL Database 教學 SQL Server 教學 Xamarin.Forms 教學