Sdílet prostřednictvím


Xamarin.Forms Registrace a řešení služby DependencyService

Při použití k Xamarin.FormsDependencyService vyvolání nativní funkce platformy musí být implementace platformy registrovány v nástroji DependencyServicea následně vyřešeny ze sdíleného kódu, aby je vyvolaly.

Registrace implementací platformy

Implementace platformy musí být zaregistrované v DependencyService rámci, aby Xamarin.Forms je bylo možné vyhledat za běhu.

Registraci lze provést pomocí nástroje DependencyAttribute, nebo pomocí Register metod a RegisterSingleton metod.

Důležité

Vydané buildy projektů UPW, které používají nativní kompilaci .NET, by měly registrovat implementace platformy s metodami Register .

Registrace podle atributu

Lze DependencyAttribute použít k registraci implementace platformy v nástroji DependencyService. Atribut označuje, že zadaný typ poskytuje konkrétní implementaci rozhraní.

Následující příklad používá DependencyAttribute k registraci implementace IDeviceOrientationService iOS rozhraní:

using Xamarin.Forms;

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

V tomto příkladu DependencyAttribute registruje s DeviceOrientationServiceDependencyService. Výsledkem je registrace konkrétního typu v rozhraní, které implementuje.

Podobně by měly být implementace IDeviceOrientationService rozhraní na jiných platformách registrovány DependencyAttributev .

Poznámka:

Registrace se DependencyAttribute provádí na úrovni oboru názvů.

Registrace podle metody

Metody DependencyService.Register a metodu RegisterSingleton lze použít k registraci implementace platformy v nástroji DependencyService.

Následující příklad používá metodu Register k registraci implementace IDeviceOrientationService iOS rozhraní:

[Register("AppDelegate")]
public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
{
    public override bool FinishedLaunching(UIApplication app, NSDictionary options)
    {
        global::Xamarin.Forms.Forms.Init();
        LoadApplication(new App());
        DependencyService.Register<IDeviceOrientationService, DeviceOrientationService>();
        return base.FinishedLaunching(app, options);
    }
}

V tomto příkladu Register metoda registruje konkrétní typ , DeviceOrientationServiceproti IDeviceOrientationService rozhraní. Alternativně lze přetížení Register metody použít k registraci implementace platformy pomocí DependencyService:

DependencyService.Register<DeviceOrientationService>();

V tomto příkladu Register metoda zaregistruje s DeviceOrientationServiceDependencyService. Výsledkem je registrace konkrétního typu v rozhraní, které implementuje.

Alternativně lze existující instanci objektu zaregistrovat jako jednoúčelovou metodu RegisterSingleton :

var service = new DeviceOrientationService();
DependencyService.RegisterSingleton<IDeviceOrientationService>(service);

V tomto příkladu RegisterSingleton metoda zaregistruje instanci objektu DeviceOrientationServiceIDeviceOrientationService proti rozhraní jako singleton.

Podobně lze implementace IDeviceOrientationService rozhraní na jiných platformách zaregistrovat pomocí Register metod nebo RegisterSingleton metody.

Důležité

Registrace pomocí Register a RegisterSingleton metod musí být provedena v projektech platformy před vyvoláním funkcí poskytovaných implementací platformy ze sdíleného kódu.

Řešení implementací platformy

Implementace platformy je nutné před vyvolání vyřešit. To se obvykle provádí ve sdíleném kódu pomocí DependencyService.Get<T> metody. Lze ho však také provést pomocí DependencyService.Resolve<T> metody.

Ve výchozím nastavení přeloží pouze implementace platformy, DependencyService které mají konstruktory bez parametrů. Metodu řešení závislostí ale můžete vložit do Xamarin.Forms kontejneru injektáže závislostí nebo metod továrny k řešení implementací platformy. Tento přístup lze použít k řešení implementací platformy, které mají konstruktory s parametry. Další informace naleznete v tématu Řešení závislostí v Xamarin.Formstématu .

Důležité

Vyvolání implementace platformy, která nebyla zaregistrována, DependencyService způsobí NullReferenceException vyvolání vyvolání.

Řešení s využitím metody Get<T>

Metoda Get<T> načte implementaci platformy rozhraní T za běhu a buď:

  • Vytvoří instanci jako jednoúčelový objekt.
  • Vrátí existující instanci jako singleton, která byla zaregistrována DependencyService metodou RegisterSingleton .

V obou případech bude instance fungovat po celou dobu života aplikace a všechna následná volání k vyřešení stejné implementace platformy načtou stejnou instanci.

Následující kód ukazuje příklad volání Get<T> metody k vyřešení IDeviceOrientationService rozhraní a následné vyvolání jeho GetOrientation metody:

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

Alternativně lze tento kód zúžením na jeden řádek:

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

Poznámka:

Metoda Get<T> ve výchozím nastavení vrátí instanci implementace rozhraní T platformy jako jednoúčelový. Toto chování je však možné změnit. Další informace najdete v tématu Správa doby života vyřešených objektů.

Řešení s využitím metody Resolve<T>

Metoda Resolve<T> načte implementaci platformy rozhraní T za běhu pomocí metody řešení závislostí, která byla vložena do Xamarin.FormsDependencyResolver třídy. Pokud metoda řešení závislostí nebyla vložena do Xamarin.Forms, Resolve<T> metoda se vrátí k volání Get<T> metody pro načtení implementace platformy. Další informace o vložení metody řešení závislostí do Xamarin.Forms, naleznete v tématu Řešení závislostí v Xamarin.Formstématu .

Následující kód ukazuje příklad volání Resolve<T> metody k vyřešení IDeviceOrientationService rozhraní a následné vyvolání jeho GetOrientation metody:

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

Alternativně lze tento kód zúžením na jeden řádek:

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

Poznámka:

Když se Resolve<T> metoda vrátí zpět k volání Get<T> metody, vrátí ve výchozím nastavení instanci implementace platformy rozhraní T jako jednoton. Toto chování je však možné změnit. Další informace najdete v tématu Správa doby života vyřešených objektů.

Správa doby života vyřešených objektů

Výchozím chováním DependencyService třídy je řešení implementací platformy jako singletonů. Implementace platformy proto budou žít po celou dobu života aplikace.

Toto chování je určeno volitelným argumentem DependencyFetchTarget pro metody Get<T> a Resolve<T> metody. Výčet DependencyFetchTarget definuje dva členy:

  • GlobalInstance, která vrací implementaci platformy jako singleton.
  • NewInstance, která vrací novou instanci implementace platformy. Aplikace pak zodpovídá za správu životnosti instance implementace platformy.

Obě metody Get<T>Resolve<T> nastaví jejich volitelné argumenty na DependencyFetchTarget.GlobalInstance, a tak implementace platformy jsou vždy vyřešeny jako singletony. Toto chování lze změnit, aby se vytvořily nové instance implementací platformy zadáním DependencyFetchTarget.NewInstance argumentů pro metody Get<T> a Resolve<T> metody:

ITextToSpeechService service = DependencyService.Get<ITextToSpeechService>(DependencyFetchTarget.NewInstance);

V tomto příkladu DependencyService vytvoří novou instanci implementace platformy pro ITextToSpeechService rozhraní. Všechna následná volání k vyřešení ITextToSpeechService budou také vytvářet nové instance.

Důsledkem vždy vytvoření nové instance implementace platformy je, že aplikace je zodpovědná za správu životnosti instancí. To znamená, že pokud se přihlásíte k odběru události definované v implementaci platformy, měli byste se odhlásit od události, pokud už implementace platformy není nutná. Kromě toho to znamená, že může být nezbytné, aby implementace platformy implementovaly IDisposablea vyčistit své prostředky v Dispose metodách. Ukázková aplikace ukazuje tento scénář ve svých TextToSpeechService implementacích platformy.

Když aplikace dokončí použití implementace platformy, která implementuje IDisposable, měla by volat implementaci objektu Dispose . Jedním ze způsobů, jak toho dosáhnout, je using příkaz:

ITextToSpeechService service = DependencyService.Get<ITextToSpeechService>(DependencyFetchTarget.NewInstance);
using (service as IDisposable)
{
    await service.SpeakAsync("Hello world");
}

V tomto příkladu SpeakAsync po vyvolání using metody příkaz automaticky odstraní objekt implementace platformy. Výsledkem je vyvolání metody objektu Dispose , která provede požadované vyčištění.

Další informace o volání metody objektu Dispose naleznete v tématu Použití objektů, které implementují IDisposable.