Xamarin.Forms の DependencyService の概要Xamarin.Forms DependencyService Introduction

サンプルのダウンロードサンプルのダウンロードDownload Sample Download the sample

DependencyService クラスは、Xamarin.Forms アプリケーションで共有コードからネイティブ プラットフォームの機能を起動できるようにするサービス ロケーターです。The DependencyService class is a service locator that enables Xamarin.Forms applications to invoke native platform functionality from shared code.

DependencyService を使用してネイティブ プラットフォームの機能を呼び出すプロセスは、次のとおりです。The process for using the DependencyService to invoke native platform functionality is to:

  1. 共有コード内に、ネイティブ プラットフォームの機能用のインターフェイスを作成します。Create an interface for the native platform functionality, in shared code. 詳細については、「インターフェイスの作成」をご覧ください。For more information, see Create an interface.
  2. 必要なプラットフォーム プロジェクト内にインターフェイスを実装します。Implement the interface in the required platform projects. 詳細については、「各プラットフォームでのインターフェイスの実装」をご覧ください。For more information, see Implement the interface on each platform.
  3. DependencyService にプラットフォームの実装を登録します。Register the platform implementations with the DependencyService. これにより、実行時に Xamarin.Forms でプラットフォームの実装を検索できます。This enables Xamarin.Forms to locate the platform implementations at runtime. 詳細については、「プラットフォームの実装の登録」をご覧ください。For more information, see Register the platform implementations.
  4. 共有コードからプラットフォームの実装を解決し、それらを呼び出します。Resolve the platform implementations from shared code, and invoke them. 詳細については、「プラットフォームの実装の解決」をご覧ください。For more information, see Resolve the platform implementations.

次の図は、ネイティブ プラットフォームの機能が Xamarin.Forms アプリケーション内でどのように呼び出されるかを示しています。The following diagram shows how native platform functionality is invoked in a Xamarin.Forms application:

Xamarin.Forms DependencyService クラスを使用したサービスの場所の概要Overview of service location using the Xamarin.Forms DependencyService class

インターフェイスの作成Create an interface

共有コードからネイティブ プラットフォームの機能を呼び出せるようにするための最初の手順は、ネイティブ プラットフォームの機能と対話するための API を定義するインターフェイスの作成です。The first step in being able to invoke native platform functionality from shared code, is to create an interface that defines the API for interacting with the native platform functionality. このインターフェイスは、共有コード プロジェクト内に配置する必要があります。This interface should be placed in your shared code project.

次の例は、デバイスの向きを取得するために使用できる API 用のインターフェイスを示しています。The following example shows an interface for an API that can be used to retrieve the orientation of a device:

public interface IDeviceOrientationService
{
    DeviceOrientation GetOrientation();
}

各プラットフォームでのインターフェイスの実装Implement the interface on each platform

ネイティブ プラットフォームの機能と対話するための API を定義するインターフェイスを作成した後で、各プラットフォーム プロジェクト内にインターフェイスを実装する必要があります。After creating the interface that defines the API for interacting with the native platform functionality, the interface must be implemented in each platform project.

iOSiOS

次のコード例は、iOS 上の IDeviceOrientationService インターフェイスの実装を示しています。The following code example shows the implementation of the IDeviceOrientationService interface on iOS:

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;
        }
    }
}

AndroidAndroid

次のコード例は、Android 上の IDeviceOrientationService インターフェイスの実装を示しています。The following code example shows the implementation of the IDeviceOrientationService interface on Android:

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 プラットフォームUniversal Windows Platform

次のコード例は、ユニバーサル Windows プラットフォーム (UWP) 上の IDeviceOrientationService インターフェイスの実装を示しています。The following code example shows the implementation of the IDeviceOrientationService interface on the Universal Windows Platform (UWP):

namespace DependencyServiceDemos.UWP
{
    public class DeviceOrientationService : IDeviceOrientationService
    {
        public DeviceOrientation GetOrientation()
        {
            ApplicationViewOrientation orientation = ApplicationView.GetForCurrentView().Orientation;
            return orientation == ApplicationViewOrientation.Landscape ? DeviceOrientation.Landscape : DeviceOrientation.Portrait;
        }
    }
}

プラットフォームの実装の登録Register the platform implementations

各プラットフォーム プロジェクト内にインターフェイスを実装した後で、プラットフォームの実装を DependencyService に登録して、Xamarin.Forms でそれらを実行時に検索できるようにする必要があります。After implementing the interface in each platform project, the platform implementations must be registered with the DependencyService, so that Xamarin.Forms can locate them at runtime. これは一般に DependencyAttribute を使用して実行され、指定した型によってインターフェイスの実装が提供されることを示します。This is typically performed with the DependencyAttribute, which indicates that the specified type provides an implementation of the interface.

次の例は、DependencyAttribute を使用した IDeviceOrientationService インターフェイスの iOS 実装の登録を示しています。The following example shows using the DependencyAttribute to register the iOS implementation of the IDeviceOrientationService interface:

using Xamarin.Forms;

[assembly: Dependency(typeof(DependencyServiceDemos.iOS.DeviceOrientationService))]
namespace DependencyServiceDemos.iOS
{
    public class DeviceOrientationService : IDeviceOrientationService
    {
        public DeviceOrientation GetOrientation()
        {
            ...
        }
    }
}

この例では、DependencyAttribute によって DeviceOrientationServiceDependencyService に登録しています。In this example, the DependencyAttribute registers the DeviceOrientationService with the DependencyService. 同様に、DependencyAttribute を使用して他のプラットフォーム上の IDeviceOrientationService インターフェイスの実装を登録する必要があります。Similarly, the implementations of the IDeviceOrientationService interface on other platforms should be registered with the DependencyAttribute.

DependencyService へのプラットフォームの実装の登録の詳細については、「Xamarin.Forms の DependencyService の登録と解決」をご覧ください。For more information about registering platform implementations with the DependencyService, see Xamarin.Forms DependencyService Registration and Resolution.

プラットフォームの実装の解決Resolve the platform implementations

DependencyService にプラットフォームの実装を登録した後、呼び出される前にその実装を解決する必要があります。Following registration of platform implementations with the DependencyService, the implementations must be resolved before being invoked. これは一般に、DependencyService.Get<T> メソッドを使用して共有コード内で実行されます。This is typically performed in shared code using the DependencyService.Get<T> method.

次のコードは、Get<T> メソッドを呼び出して IDeviceOrientationService インターフェイスを解決してから、その GetOrientation メソッドを呼び出す例を示しています。The following code shows an example of calling the Get<T> method to resolve the IDeviceOrientationService interface, and then invoking its GetOrientation method:

IDeviceOrientationService service = DependencyService.Get<IDeviceOrientationService>();
DeviceOrientation orientation = service.GetOrientation();

または、このコードは、1 行に圧縮できます。Alternatively, this code can be condensed into a single line:

DeviceOrientation orientation = DependencyService.Get<IDeviceOrientationService>().GetOrientation();

DependencyService でのプラットフォームの実装の解決の詳細については、「Xamarin.Forms の DependencyService の登録と解決」をご覧ください。For more information about resolving platform implementations with the DependencyService, see Xamarin.Forms DependencyService Registration and Resolution.