Xamarin.Forms DependencyService Kaydı ve Çözümü
yerel platform işlevselliğini çağırmak için kullanılırken Xamarin.FormsDependencyService
, platform uygulamalarının DependencyService
öğesine kaydedilmesi ve sonra bunları çağırmak için paylaşılan koddan çözümlenmesi gerekir.
Platform uygulamalarını kaydetme
Platform uygulamalarının çalışma zamanında bulunabilmesi Xamarin.Forms için ile DependencyService
kaydedilmesi gerekir.
Kayıt, ile DependencyAttribute
veya ve RegisterSingleton
yöntemleriyle Register
gerçekleştirilebilir.
Önemli
.NET yerel derlemesi kullanan UWP projelerinin yayın derlemeleri, platform uygulamalarını yöntemlerle Register
kaydetmelidir.
Özniteliğe göre kayıt
ile DependencyAttribute
bir platform uygulaması DependencyService
kaydetmek için kullanılabilir. özniteliği, belirtilen türün arabirimin somut bir uygulamasını sağladığını gösterir.
Aşağıdaki örnek DependencyAttribute
, arabiriminin iOS uygulamasını IDeviceOrientationService
kaydetmek için kullanır:
using Xamarin.Forms;
[assembly: Dependency(typeof(DeviceOrientationService))]
namespace DependencyServiceDemos.iOS
{
public class DeviceOrientationService : IDeviceOrientationService
{
public DeviceOrientation GetOrientation()
{
...
}
}
}
Bu örnekte, DependencyAttribute
ile kaydeder DeviceOrientationService
DependencyService
. Bu, somut türün uyguladığı arabirime göre kaydedilmesine neden olur.
Benzer şekilde, arabiriminin IDeviceOrientationService
diğer platformlardaki uygulamaları ile DependencyAttribute
kaydedilmelidir.
Not
ile DependencyAttribute
kayıt, ad alanı düzeyinde gerçekleştirilir.
Yönteme göre kayıt
DependencyService.Register
yöntemleri ve RegisterSingleton
yöntemi ile bir platform uygulamasını DependencyService
kaydetmek için kullanılabilir.
Aşağıdaki örnek, arabiriminin Register
iOS uygulamasını IDeviceOrientationService
kaydetmek için yöntemini kullanır:
[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);
}
}
Bu örnekte yöntemi, Register
arabirimine karşı IDeviceOrientationService
somut türünü DeviceOrientationService
kaydeder. Alternatif olarak, bir platform uygulamasını ile kaydetmek için yönteminin Register
DependencyService
aşırı yüklemesi kullanılabilir:
DependencyService.Register<DeviceOrientationService>();
Bu örnekte yöntemi ile Register
kaydeder DeviceOrientationService
DependencyService
. Bu, somut türün uyguladığı arabirime göre kaydedilmesine neden olur.
Alternatif olarak, mevcut bir nesne örneği yöntemiyle RegisterSingleton
tekil olarak kaydedilebilir:
var service = new DeviceOrientationService();
DependencyService.RegisterSingleton<IDeviceOrientationService>(service);
Bu örnekte yöntemi, RegisterSingleton
nesne örneğini DeviceOrientationService
tekil olarak arabirime IDeviceOrientationService
kaydeder.
Benzer şekilde, arabirimin IDeviceOrientationService
diğer platformlardaki uygulamaları yöntemlere veya yöntemine Register
RegisterSingleton
kaydedilebilir.
Önemli
Platform uygulaması tarafından sağlanan işlevler paylaşılan koddan çağrılmadan önce platform projelerinde ve RegisterSingleton
yöntemleriyle Register
kayıt gerçekleştirilmelidir.
Platform uygulamalarını çözme
Platform uygulamaları çağrılmadan önce çözümlenmelidir. Bu genellikle yöntemi kullanılarak paylaşılan kodda DependencyService.Get<T>
gerçekleştirilir. Ancak, yöntemiyle DependencyService.Resolve<T>
de gerçekleştirilebilir.
Varsayılan olarak, DependencyService
yalnızca parametresiz oluşturucuları olan platform uygulamalarını çözümler. Ancak, platform uygulamalarını çözümlemek için bağımlılık ekleme kapsayıcısı veya fabrika yöntemleri kullanan bir bağımlılık çözümleme yöntemi Xamarin.Forms eklenebilir. Bu yaklaşım, parametreleri olan oluşturucuları olan platform uygulamalarını çözümlemek için kullanılabilir. Daha fazla bilgi için bkz . içindeki Xamarin.Formsbağımlılık çözümlemesi.
Önemli
ile kaydedilmemiş bir platform uygulamasını çağırmak DependencyService
, bir NullReferenceException
atılmasıyla sonuçlanır.
Get<T> yöntemini kullanarak çözümle
yöntemi, Get<T>
çalışma zamanında arabirimin T
platform uygulamasını alır ve aşağıdakilerden birini alır:
- Tekil olarak bir örneğini oluşturur.
- yöntemi tarafından
RegisterSingleton
ileDependencyService
kaydedilen bir tekil olarak var olan bir örneği döndürür.
Her iki durumda da örnek uygulamanın ömrü boyunca yaşar ve aynı platform uygulamasını çözümlemek için yapılan sonraki çağrılar aynı örneği alır.
Aşağıdaki kod, arabirimi çözümlemek IDeviceOrientationService
için yöntemini çağırma Get<T>
ve ardından yöntemini çağırma örneğini GetOrientation
gösterir:
IDeviceOrientationService service = DependencyService.Get<IDeviceOrientationService>();
DeviceOrientation orientation = service.GetOrientation();
Alternatif olarak, bu kod tek bir satırda değiştirilebilir:
DeviceOrientation orientation = DependencyService.Get<IDeviceOrientationService>().GetOrientation();
Not
yöntemi, Get<T>
varsayılan olarak arabirimin T
platform uygulamasının bir örneğini tekil olarak döndürür. Ancak, bu davranış değiştirilebilir. Daha fazla bilgi için bkz . Çözümlenen nesnelerin ömrünü yönetme.
Çözümle T> yöntemini kullanarak çözme<
Resolve<T>
yöntemi, sınıfına DependencyResolver
eklenmiş Xamarin.Forms bir bağımlılık çözümleme yöntemi kullanarak çalışma zamanında arabiriminin T
platform uygulamasını alır. içine bir bağımlılık çözümleme yöntemi eklenmemişse Xamarin.FormsResolve<T>
yöntemi, platform uygulamasını almak için yöntemini çağırmaya Get<T>
geri dönüş yapacaktır. içine bağımlılık çözümleme yöntemi Xamarin.Formsekleme hakkında daha fazla bilgi için bkz . içindeki Xamarin.Formsbağımlılık çözümlemesi.
Aşağıdaki kod, arabirimi çözümlemek IDeviceOrientationService
için yöntemini çağırma Resolve<T>
ve ardından yöntemini çağırma örneğini GetOrientation
gösterir:
IDeviceOrientationService service = DependencyService.Resolve<IDeviceOrientationService>();
DeviceOrientation orientation = service.GetOrientation();
Alternatif olarak, bu kod tek bir satırda değiştirilebilir:
DeviceOrientation orientation = DependencyService.Resolve<IDeviceOrientationService>().GetOrientation();
Not
Resolve<T>
yöntemi, yöntemini çağırmaya Get<T>
geri döndüğünde, varsayılan olarak arabirimin T
platform uygulamasının bir örneğini tekil olarak döndürür. Ancak, bu davranış değiştirilebilir. Daha fazla bilgi için bkz . Çözümlenen nesnelerin ömrünü yönetme.
Çözümlenen nesnelerin yaşam ömrünü yönetme
sınıfının varsayılan davranışı DependencyService
, platform uygulamalarını tekil olarak çözümlemektir. Bu nedenle, platform uygulamaları bir uygulamanın ömrü boyunca yaşayacaktır.
Bu davranış ve Resolve<T>
yöntemlerindeki DependencyFetchTarget
Get<T>
isteğe bağlı bağımsız değişkenle belirtilir. Numaralandırma DependencyFetchTarget
iki üye tanımlar:
GlobalInstance
, platform uygulamasını tekil olarak döndürür.NewInstance
, platform uygulamasının yeni bir örneğini döndürür. Uygulama daha sonra platform uygulama örneğinin kullanım ömrünü yönetmekle sorumludur.
Get<T>
ve Resolve<T>
yöntemleri isteğe bağlı bağımsız değişkenlerini DependencyFetchTarget.GlobalInstance
olarak ayarlar ve bu nedenle platform uygulamaları her zaman tekil olarak çözümlenir. Bu davranış değiştirilebilir, böylece ve Resolve<T>
yöntemleri için bağımsız değişkenler olarak belirterek DependencyFetchTarget.NewInstance
platform uygulamalarının Get<T>
yeni örnekleri oluşturulabilir:
ITextToSpeechService service = DependencyService.Get<ITextToSpeechService>(DependencyFetchTarget.NewInstance);
Bu örnekte, DependencyService
arabirimi için platform uygulamasının yeni bir örneğini ITextToSpeechService
oluşturur. çözümlenecek ITextToSpeechService
sonraki çağrılar da yeni örnekler oluşturur.
Platform uygulamasının her zaman yeni bir örneğini oluşturmanın sonucu, uygulamanın örneklerin ömrünü yönetmekle sorumlu hale gelmesidir. Başka bir deyişle, platform uygulamasında tanımlanan bir olaya abone olursanız, platform uygulaması artık gerekli olmadığında olay aboneliğini kaldırmanız gerekir. Buna ek olarak, platform uygulamalarının IDisposable
uygulamasının ve kaynaklarını yöntemlerle Dispose
temizlemenin gerekli olabileceği anlamına gelir. Örnek uygulama, bu senaryoyu TextToSpeechService
platform uygulamalarında gösterir.
Bir uygulama, uygulamasını uygulayan IDisposable
bir platform uygulamasını kullanmayı bitirdiğinde nesnenin Dispose
uygulamasını çağırmalıdır. Bunu gerçekleştirmenin bir yolu bir using
deyimidir:
ITextToSpeechService service = DependencyService.Get<ITextToSpeechService>(DependencyFetchTarget.NewInstance);
using (service as IDisposable)
{
await service.SpeakAsync("Hello world");
}
Bu örnekte, yöntemi çağrıldıktan using
sonra SpeakAsync
deyimi platform uygulama nesnesini otomatik olarak atar. Bu, nesnenin Dispose
yönteminin çağrılarak gerekli temizlemeyi gerçekleştirmesine neden olur.
Bir nesnenin Dispose
yöntemini çağırma hakkında daha fazla bilgi için bkz . IDisposable uygulayan nesneleri kullanma.