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

Download Sample Скачайте пример

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

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

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

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

Overview of service location using the Xamarin.Forms DependencyService class

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

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