Xamarin.Forms の DependencyService の概要
DependencyService
クラスは、Xamarin.Forms アプリケーションで共有コードからネイティブ プラットフォームの機能を起動できるようにするサービス ロケーターです。
DependencyService
を使用してネイティブ プラットフォームの機能を呼び出すプロセスは、次のとおりです。
- 共有コード内に、ネイティブ プラットフォームの機能用のインターフェイスを作成します。 詳細については、「インターフェイスの作成」をご覧ください。
- 必要なプラットフォーム プロジェクト内にインターフェイスを実装します。 詳細については、「各プラットフォームでのインターフェイスの実装」をご覧ください。
DependencyService
にプラットフォームの実装を登録します。 これにより、実行時に Xamarin.Forms でプラットフォームの実装を検索できます。 詳細については、「プラットフォームの実装の登録」をご覧ください。- 共有コードからプラットフォームの実装を解決し、それらを呼び出します。 詳細については、「プラットフォームの実装の解決」をご覧ください。
次の図は、ネイティブ プラットフォームの機能が Xamarin.Forms アプリケーション内でどのように呼び出されるかを示しています。
インターフェイスの作成
共有コードからネイティブ プラットフォームの機能を呼び出せるようにするための最初の手順は、ネイティブ プラットフォームの機能と対話するための API を定義するインターフェイスの作成です。 このインターフェイスは、共有コード プロジェクト内に配置する必要があります。
次の例は、デバイスの向きを取得するために使用できる API 用のインターフェイスを示しています。
public interface IDeviceOrientationService
{
DeviceOrientation GetOrientation();
}
各プラットフォームでのインターフェイスの実装
ネイティブ プラットフォームの機能と対話するための API を定義するインターフェイスを作成した後で、各プラットフォーム プロジェクト内にインターフェイスを実装する必要があります。
iOS
次のコード例は、iOS 上の IDeviceOrientationService
インターフェイスの実装を示しています。
namespace DependencyServiceDemos.iOS
{
public class DeviceOrientationService : IDeviceOrientationService
{
public DeviceOrientation GetOrientation()
{
UIInterfaceOrientation orientation = UIApplication.SharedApplication.StatusBarOrientation;
bool isPortrait = orientation == UIInterfaceOrientation.Portrait ||
orientation == UIInterfaceOrientation.PortraitUpsideDown;
return isPortrait ? DeviceOrientation.Portrait : DeviceOrientation.Landscape;
}
}
}
Android
次のコード例は、Android 上の IDeviceOrientationService
インターフェイスの実装を示しています。
namespace DependencyServiceDemos.Droid
{
public class DeviceOrientationService : IDeviceOrientationService
{
public DeviceOrientation GetOrientation()
{
IWindowManager windowManager = Android.App.Application.Context.GetSystemService(Context.WindowService).JavaCast<IWindowManager>();
SurfaceOrientation orientation = windowManager.DefaultDisplay.Rotation;
bool isLandscape = orientation == SurfaceOrientation.Rotation90 ||
orientation == SurfaceOrientation.Rotation270;
return isLandscape ? DeviceOrientation.Landscape : DeviceOrientation.Portrait;
}
}
}
ユニバーサル Windows プラットフォーム
次のコード例は、ユニバーサル Windows プラットフォーム (UWP) 上の IDeviceOrientationService
インターフェイスの実装を示しています。
namespace DependencyServiceDemos.UWP
{
public class DeviceOrientationService : IDeviceOrientationService
{
public DeviceOrientation GetOrientation()
{
ApplicationViewOrientation orientation = ApplicationView.GetForCurrentView().Orientation;
return orientation == ApplicationViewOrientation.Landscape ? DeviceOrientation.Landscape : DeviceOrientation.Portrait;
}
}
}
プラットフォームの実装の登録
各プラットフォーム プロジェクト内にインターフェイスを実装した後で、プラットフォームの実装を DependencyService
に登録して、Xamarin.Forms でそれらを実行時に検索できるようにする必要があります。 これは一般に DependencyAttribute
を使用して実行され、指定した型によってインターフェイスの実装が提供されることを示します。
次の例は、DependencyAttribute
を使用した IDeviceOrientationService
インターフェイスの iOS 実装の登録を示しています。
using Xamarin.Forms;
[assembly: Dependency(typeof(DependencyServiceDemos.iOS.DeviceOrientationService))]
namespace DependencyServiceDemos.iOS
{
public class DeviceOrientationService : IDeviceOrientationService
{
public DeviceOrientation GetOrientation()
{
...
}
}
}
この例では、DependencyAttribute
によって DeviceOrientationService
を DependencyService
に登録しています。 同様に、DependencyAttribute
を使用して他のプラットフォーム上の IDeviceOrientationService
インターフェイスの実装を登録する必要があります。
DependencyService
へのプラットフォームの実装の登録の詳細については、「Xamarin.Forms の DependencyService の登録と解決」をご覧ください。
プラットフォームの実装の解決
DependencyService
にプラットフォームの実装を登録した後、呼び出される前にその実装を解決する必要があります。 これは一般に、DependencyService.Get<T>
メソッドを使用して共有コード内で実行されます。
次のコードは、Get<T>
メソッドを呼び出して IDeviceOrientationService
インターフェイスを解決してから、その GetOrientation
メソッドを呼び出す例を示しています。
IDeviceOrientationService service = DependencyService.Get<IDeviceOrientationService>();
DeviceOrientation orientation = service.GetOrientation();
または、このコードは、1 行に圧縮できます。
DeviceOrientation orientation = DependencyService.Get<IDeviceOrientationService>().GetOrientation();
DependencyService
でのプラットフォームの実装の解決の詳細については、「Xamarin.Forms の DependencyService の登録と解決」をご覧ください。