Общие сведения о Xamarin.Forms DependencyService

Класс DependencyService — это указатель служб, который позволяет приложениям Xamarin.Forms вызывать собственные функции платформы из общего кода.

Использование DependencyService для вызова собственных функций платформы включает следующее:

  1. Создание интерфейса для собственных функций платформы в общем коде. Дополнительные сведения см. в разделе Создание интерфейса.
  2. Реализацию интерфейса в требуемых проектах платформы. Дополнительные сведения см. в разделе Реализация интерфейса для каждой платформы.
  3. Регистрацию реализаций платформы в DependencyService. Это позволяет Xamarin.Forms найти реализации платформы во время выполнения. Дополнительные сведения см. в разделе Регистрация реализаций платформы.
  4. Разрешение реализаций платформы из общего кода и их вызов. Дополнительные сведения см. в разделе Разрешение реализаций платформы.

На следующей схеме показано, как собственные функции платформы вызываются в приложении Xamarin.Forms.

Обзор расположения службы с помощью Xamarin.Forms класса DependencyService

Выбор интерфейса

Чтобы обеспечить возможность вызова собственных функций платформы из общего кода, сперва нужно создать интерфейс, который определяет API для взаимодействия с собственными функциями платформы. Этот интерфейс должен находиться в проекте с общим кодом.

Следующий пример демонстрирует интерфейс для API, который может использоваться для получения данных об ориентации устройства:

public interface IDeviceOrientationService
{
    DeviceOrientation GetOrientation();
}

Реализация интерфейса для каждой платформы

Созданный интерфейс, определяющий API для взаимодействия с собственными функциями платформы, необходимо реализовать в каждом проекте платформы.

iOS

В следующем примере кода показана реализация интерфейса IDeviceOrientationService для 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;
        }
    }
}

Android

В следующем примере кода показана реализация интерфейса IDeviceOrientationService для 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

В следующем примере кода показана реализация интерфейса IDeviceOrientationService для универсальной платформы Windows (UWP):

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. Аналогичным образом реализации интерфейса IDeviceOrientationService на других платформах должны быть зарегистрированы с помощью DependencyAttribute.

Дополнительные сведения о регистрации реализаций платформы в DependencyService см. в статье Регистрация и разрешение класса Xamarin.Forms DependencyService.

Разрешение реализаций платформы

Зарегистрированные реализации платформы в DependencyService необходимо разрешить до их вызова. Обычно это делается в общем коде с помощью метода DependencyService.Get<T>.

Следующий пример кода демонстрирует вызов метода Get<T> для разрешения интерфейса IDeviceOrientationService и последующего вызова его метода GetOrientation:

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

Этот код можно сократить до одной строки:

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

Дополнительные сведения о разрешении реализаций платформы в DependencyService см. в статье Регистрация и разрешение класса Xamarin.Forms DependencyService.