Xamarin.Forms Pendaftaran dan Resolusi DependencyService
Saat menggunakan Xamarin.FormsDependencyService
untuk memanggil fungsionalitas platform asli, implementasi platform harus didaftarkan dengan DependencyService
, lalu diselesaikan dari kode bersama untuk memanggilnya.
Mendaftarkan implementasi platform
Implementasi platform harus didaftarkan dengan DependencyService
sehingga Xamarin.Forms dapat menemukannya pada runtime.
Pendaftaran dapat dilakukan dengan DependencyAttribute
, atau dengan Register
metode dan RegisterSingleton
.
Penting
Rilis build proyek UWP yang menggunakan kompilasi asli .NET harus mendaftarkan implementasi platform dengan Register
metode .
Pendaftaran berdasarkan atribut
DependencyAttribute
dapat digunakan untuk mendaftarkan implementasi platform dengan DependencyService
. Atribut menunjukkan bahwa jenis yang ditentukan menyediakan implementasi konkret antarmuka.
Contoh berikut menggunakan DependencyAttribute
untuk mendaftarkan implementasi iOS antarmuka IDeviceOrientationService
:
using Xamarin.Forms;
[assembly: Dependency(typeof(DeviceOrientationService))]
namespace DependencyServiceDemos.iOS
{
public class DeviceOrientationService : IDeviceOrientationService
{
public DeviceOrientation GetOrientation()
{
...
}
}
}
Dalam contoh ini, DependencyAttribute
mendaftarkan DeviceOrientationService
dengan DependencyService
. Ini menghasilkan jenis konkret yang didaftarkan terhadap antarmuka yang diimplementasikannya.
Demikian pula, implementasi IDeviceOrientationService
antarmuka pada platform lain harus terdaftar dengan DependencyAttribute
.
Catatan
Pendaftaran dengan DependencyAttribute
dilakukan pada tingkat namespace layanan.
Pendaftaran menurut metode
Metode DependencyService.Register
, dan metode , RegisterSingleton
dapat digunakan untuk mendaftarkan implementasi platform dengan DependencyService
.
Contoh berikut menggunakan Register
metode untuk mendaftarkan implementasi iOS antarmuka IDeviceOrientationService
:
[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);
}
}
Dalam contoh ini, Register
metode mendaftarkan jenis beton, DeviceOrientationService
, terhadap IDeviceOrientationService
antarmuka. Atau, kelebihan metode Register
dapat digunakan untuk mendaftarkan implementasi platform dengan DependencyService
:
DependencyService.Register<DeviceOrientationService>();
Dalam contoh ini, Register
metode mendaftarkan DeviceOrientationService
dengan DependencyService
. Ini menghasilkan jenis konkret yang didaftarkan terhadap antarmuka yang diimplementasikannya.
Atau, instans objek yang ada dapat didaftarkan sebagai singleton dengan RegisterSingleton
metode :
var service = new DeviceOrientationService();
DependencyService.RegisterSingleton<IDeviceOrientationService>(service);
Dalam contoh ini, RegisterSingleton
metode mendaftarkan DeviceOrientationService
instans objek terhadap IDeviceOrientationService
antarmuka, sebagai singleton.
Demikian pula, implementasi IDeviceOrientationService
antarmuka pada platform lain dapat didaftarkan dengan Register
metode , atau RegisterSingleton
metode .
Penting
Pendaftaran dengan Register
metode dan RegisterSingleton
harus dilakukan dalam proyek platform, sebelum fungsionalitas yang disediakan oleh implementasi platform dipanggil dari kode bersama.
Mengatasi implementasi platform
Implementasi platform harus diselesaikan sebelum dipanggil. Ini biasanya dilakukan dalam kode bersama menggunakan DependencyService.Get<T>
metode . Namun, itu juga dapat dicapai dengan metode .DependencyService.Resolve<T>
Secara default, DependencyService
hanya akan menyelesaikan implementasi platform yang memiliki konstruktor tanpa parameter. Namun, metode resolusi dependensi dapat disuntikkan ke dalam Xamarin.Forms yang menggunakan kontainer injeksi dependensi atau metode pabrik untuk menyelesaikan implementasi platform. Pendekatan ini dapat digunakan untuk menyelesaikan implementasi platform yang memiliki konstruktor dengan parameter. Untuk informasi selengkapnya, lihat Resolusi dependensi di Xamarin.Forms.
Penting
Memanggil implementasi platform yang belum terdaftar dengan DependencyService
akan mengakibatkan NullReferenceException
dilemparkan.
Mengatasi menggunakan metode Get<T>
Metode ini Get<T>
mengambil implementasi platform antarmuka T
pada runtime, dan:
- Membuat instansnya sebagai singleton.
- Mengembalikan instans yang ada sebagai singleton, yang didaftarkan dengan
DependencyService
metodeRegisterSingleton
.
Dalam kedua kasus, instans akan hidup selama masa pakai aplikasi, dan setiap panggilan berikutnya untuk menyelesaikan implementasi platform yang sama akan mengambil instans yang sama.
Kode berikut menunjukkan contoh pemanggilan Get<T>
metode untuk menyelesaikan IDeviceOrientationService
antarmuka, lalu memanggil metodenya GetOrientation
:
IDeviceOrientationService service = DependencyService.Get<IDeviceOrientationService>();
DeviceOrientation orientation = service.GetOrientation();
Atau, kode ini dapat dikondensasikan menjadi satu baris:
DeviceOrientation orientation = DependencyService.Get<IDeviceOrientationService>().GetOrientation();
Catatan
Metode ini Get<T>
mengembalikan instans implementasi platform antarmuka T
sebagai singleton, secara default. Namun, perilaku ini dapat diubah. Untuk informasi selengkapnya, lihat Mengelola masa pakai objek yang diselesaikan.
Mengatasi menggunakan metode Resolve<T>
Metode ini Resolve<T>
mengambil implementasi platform antarmuka T
pada runtime, menggunakan metode resolusi dependensi yang telah disuntikkan ke Xamarin.FormsDependencyResolver
dalam kelas . Jika metode resolusi dependensi belum disuntikkan ke dalam Xamarin.Forms, Resolve<T>
metode akan mundur untuk memanggil Get<T>
metode untuk mengambil implementasi platform. Untuk informasi selengkapnya tentang memasukkan metode resolusi dependensi ke dalam Xamarin.Forms, lihat Resolusi dependensi di Xamarin.Forms.
Kode berikut menunjukkan contoh pemanggilan Resolve<T>
metode untuk menyelesaikan IDeviceOrientationService
antarmuka, lalu memanggil metodenya GetOrientation
:
IDeviceOrientationService service = DependencyService.Resolve<IDeviceOrientationService>();
DeviceOrientation orientation = service.GetOrientation();
Atau, kode ini dapat dikondensasikan menjadi satu baris:
DeviceOrientation orientation = DependencyService.Resolve<IDeviceOrientationService>().GetOrientation();
Catatan
Resolve<T>
Ketika metode kembali memanggil Get<T>
metode , metode mengembalikan instans implementasi platform antarmuka T
sebagai singleton, secara default. Namun, perilaku ini dapat diubah. Untuk informasi selengkapnya, lihat Mengelola masa pakai objek yang diselesaikan.
Mengelola masa pakai objek yang diselesaikan
Perilaku DependencyService
default kelas adalah menyelesaikan implementasi platform sebagai singleton. Oleh karena itu, implementasi platform akan hidup selama masa pakai aplikasi.
Perilaku ini ditentukan dengan DependencyFetchTarget
argumen opsional pada Get<T>
metode dan Resolve<T>
. Enumerasi DependencyFetchTarget
mendefinisikan dua anggota:
GlobalInstance
, yang mengembalikan implementasi platform sebagai singleton.NewInstance
, yang mengembalikan instans baru implementasi platform. Aplikasi kemudian bertanggung jawab untuk mengelola masa pakai instans implementasi platform.
Metode Get<T>
dan Resolve<T>
keduanya mengatur argumen opsional mereka ke DependencyFetchTarget.GlobalInstance
, sehingga implementasi platform selalu diselesaikan sebagai singleton. Perilaku ini dapat diubah, sehingga instans baru implementasi platform dibuat, dengan menentukan DependencyFetchTarget.NewInstance
sebagai argumen ke Get<T>
metode dan Resolve<T>
:
ITextToSpeechService service = DependencyService.Get<ITextToSpeechService>(DependencyFetchTarget.NewInstance);
Dalam contoh ini, DependencyService
membuat instans baru implementasi platform untuk ITextToSpeechService
antarmuka. Setiap panggilan berikutnya untuk menyelesaikan ITextToSpeechService
juga akan membuat instans baru.
Konsekuensi dari selalu membuat instans baru implementasi platform adalah bahwa aplikasi menjadi bertanggung jawab untuk mengelola masa pakai instans. Ini berarti bahwa jika Anda berlangganan peristiwa yang ditentukan dalam implementasi platform, Anda harus berhenti berlangganan dari peristiwa ketika implementasi platform tidak lagi diperlukan. Selain itu, ini berarti bahwa mungkin perlu bagi implementasi platform untuk mengimplementasikan IDisposable
, dan membersihkan sumber daya mereka dalam Dispose
metode. Aplikasi sampel menunjukkan skenario ini dalam implementasi platformnya TextToSpeechService
.
Ketika aplikasi selesai menggunakan implementasi platform yang menerapkan IDisposable
, aplikasi harus memanggil implementasi objek Dispose
. Salah satu cara untuk mencapai hal ini adalah dengan using
pernyataan:
ITextToSpeechService service = DependencyService.Get<ITextToSpeechService>(DependencyFetchTarget.NewInstance);
using (service as IDisposable)
{
await service.SpeakAsync("Hello world");
}
Dalam contoh ini, setelah SpeakAsync
metode dipanggil, using
pernyataan secara otomatis membuang objek implementasi platform. Ini menghasilkan metode objek Dispose
yang dipanggil, yang melakukan pembersihan yang diperlukan.
Untuk informasi selengkapnya tentang memanggil metode objek Dispose
, lihat Menggunakan objek yang mengimplementasikan IDisposable.