I am implementing MediaPicker Service that picks multiple files at once. Everything is working fine, when I use LoadApplication(new App(MultiMediaPickerService.SharedInstance));
I use this to initialize IMultiMediaPickerService
s in my shared code.
But I want to use Dependency Service to initialize and invoke methods in platform specific code.
Inshort, currently I am passing an object in LoadApplication(new App(SharedInstance))
to my shared project. SharedInstance
is a static object of MultiMediaPickerService
. Hence, instance is passed on to the shared project. But I want to do it using Dependency Service .
Here's my Interface IMultiMediaPickerService in shared project:
public interface IMultiMediaPickerService
{
event EventHandler<MediaFile> OnMediaPicked;
...
}
MultiMediaPickerService in platform project (Android):
[assembly: Dependency(typeof(MyProject.Droid.MultiMediaPickerService))]
namespace MyProject.Droid
{
public class MultiMediaPickerService : IMultiMediaPickerService
{
public static MultiMediaPickerService SharedInstance = new MultiMediaPickerService();
...
}
}
MainActivity in platform project (Android):
protected override void OnCreate(Bundle savedInstanceState)
{
...
LoadApplication(new App(MultiMediaPickerService.SharedInstance));
}
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
MultiMediaPickerService.SharedInstance.OnActivityResult(requestCode, resultCode, data);
}
I access the MultiMediaPickerService.SharedInstance
from my shared project using the above method. But I want to access it using DependencyService just like:
var multiMediaPickerService = DependencySevice.Get<IMultiMediaPickerService>();
multiMediaPickerService.OnMediaPicked += (s, a) => { Debug.WriteLine("Media Picked"); };
As this is creating another instance, I am not getting the static object MultiMediaPickerService.SharedInstance
. How it can be done? How can I access static member of the platform code from shared project using DependencyService?
I think the thing you want can be done without any static members. All you should need is to register an instance of the IMultiMediaPickerService
as a singleton in DependencyService.
IMultiMediaPickerService.cs
public interface IMultiMediaPickerService
{
...
}
MultiMediaPickerService.cs (Android implementation)
//[assembly: Dependency(typeof(MyProject.Droid.MultiMediaPickerService))] <-- remove this
namespace MyProject.Droid
{
public class MultiMediaPickerService : IMultiMediaPickerService
{
...
//no static shared instance here
}
}
MainActivity.cs
protected override void OnCreate(Bundle savedInstanceState)
{
...
//register an instance of MultiMediaPickerService as a singleton, the same instance will be returned whenever you ask for it using DependencySevice.Get<T>. Effectively, this gives you a shared instance without using static members
var multiMediaPickerService = new MultiMediaPickerService();
DependencyService.RegisterSingleton<IMultiMediaPickerService>(multiMediaPickerService);
//use the instance to initialize the app
LoadApplication(new App(multiMediaPickerService));
}
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
//whenever using the IMultiMediaPickerService, get it using the DependencyService.Get<T> method
var multiMediaPickerService = DependencyService.Get<IMultiMediaPickerService>();
multiMediaPickerService.OnActivityResult(requestCode, resultCode, data);
}
Usage
//whenever using the IMultiMediaPickerService, get it using the DependencyService.Get<T> method
var multiMediaPickerService = DependencySevice.Get<IMultiMediaPickerService>();
multiMediaPickerService.OnMediaPicked += (s, a) => { Debug.WriteLine("Media Picked"); };
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.