2016-09-14 6 views
1

Ich verwende Freshmvvm für meine Xamarin-Formulare-Projekt. Ich benutze eine Kamera und möchte plattformspezifische Funktionen nutzen. Ich habe mich gefragt, wie ich IOC-Steuerelemente verwenden kann, um plattformspezifische Funktionen zu verwenden.Xamarin Formulare: IOC in FreshMvvm

Freshmvvm.FreshIOC.Container.Register<ICamera,Camera>(); 

Wenn ich diesen Code aus der Klasse App aufrufen, Soll ich brauche beide Kameraklasse haben in iOS und Android-Projekte, wenn ja, dann wie die App-Klasse wissen lassen wir eine Kamera-Klasse von einem implementieren möchten spezifische Plattform? Oder gibt es eine bessere Möglichkeit, die IOC-Steuerung zu verwenden und die Schnittstellen in die Konstruktoren der Seitenmodelle (Ansichtsmodelle) zu injizieren, wenn wir sie verwenden wollen?

Antwort

3

Ich denke, was Sie suchen, ist die Dependency Service. Dadurch können Sie auf die native Funktion zugreifen.

Auf diese Weise müssen Sie eine Schnittstelle in Ihrem freigegebenen Code zum Beispiel ICamera erstellen.

public interface ICamera 
{ 
    void TakePicture(); 
} 

Jetzt können Sie diese Schnittstelle in den plattformspezifischen Projekten implementieren.

Zum Beispiel auf iOS Sie es wie folgt implementieren könnte:

public class CameraImplementation: ICamera { public void Takepicture() { // iOS Code hier } }

Nun ist die Schlüssel hier ist, wie Sie dies registrieren. Sie können dies tun, indem Sie ein Tag wie dieser über Ihrem Namensraum der plattformspezifischen Implementierung Hinzufügen, wie folgt aus:

[assembly: Xamarin.Forms.Dependency (typeof (CameraImplementation))] 
namespace yourapp 
{ 
    // CameraImplementation class here 
} 

Das gleiche gilt für Android geht. Wenn Sie die Benennung beibehalten, können Sie dieses Tag sogar kopieren und einfügen.

+0

Das ist, was ich suche. Vielen Dank. – TheDeveloper

+0

DependencyService wird standardmäßig als Singleton beibehalten, aber mit FreshMVVM wird manchmal eine neue Instanz erstellt. Irgendeine Idee warum und wie man die Instanz behält? – Dpedrinha

1

DependencyService in Xamarin Formen gebaut werden, das Geschäft tun, aber wenn Sie das IOC in Mvvmfresh NUR nutzen wollten können Sie -

a) Ihre Plattform spezifische Klasse registrieren (n) in der Nähe der Forms Init-Methode (IOS folgen) -

public override bool FinishedLaunching(UIApplication app, NSDictionary options) 
{ 
     global::Xamarin.Forms.Forms.Init(); 

     InitIoc(); 

     LoadApplication(new App()); 

     return base.FinishedLaunching(app, options); 
} 

private void InitIoc() 
{ 
     FreshMvvm.FreshIOC.Container.Register<IFileHelper, FileHelper>(); 
} 

mit Ihrer Klasse auf der Plattform Seite wie gewohnt bestehende -

public class FileHelper : IFileHelper 
{ 
    public string GetLocalFilePath(string filename) 
    { 
     string docFolder = Environment.GetFolderPath(Environment.SpecialFolder.Personal); 

und dann löst diese Klasse, wenn es in Ihrer PCL/Forms Projekt -

IFileHelper fileHelper = FreshMvvm.FreshIOC.Container.Resolve<IFileHelper>(); 
string dbPath = fileHelper.GetLocalFilePath("CoreSQLite.db3"); 

... 
Verwandte Themen