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 DependencyService
a 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 DeviceOrientationService
DependencyService
. 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 DependencyAttribute
v .
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 , DeviceOrientationService
proti 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 DeviceOrientationService
DependencyService
. 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 DeviceOrientationService
IDeviceOrientationService
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
metodouRegisterSingleton
.
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 IDisposable
a 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.