2016-05-19 4 views
0

Hintergrund: Ich versuche Firebase in meine MVVMCross-App zu integrieren, indem ich ihre plattformspezifischen SDKs verwende. Der grundlegende Teil meines Setups funktioniert, und zwar kann ich die grundlegenden Firebase-Funktionen verwenden, um Informationen aus einer Firebase-Datenbank in meinem Ansichtsmodell abzurufen. Es verwendet eine Schnittstelle in meiner PCL, die plattformspezifische Implementierungen in den UI-Projekten aufweist.MVVMCross Platform-spezifische Klasse mit Methode, die Instanz derselben Klasse zurückgibt

Problem: Ich möchte jedoch eine Methode in meiner Schnittstelle implementieren (und seine Implementierungen), die mit der Tatsache umgehen können, dass das Java SDK von Firebase eine Klasse namens "Firebase" mit Methoden, die die zurückgeben gleicher Typ ("Firebase"), wie die "Child" Methode in dem Java-SDK:

Firebase firebase = new Firebase("URI"); 
Firebase firebasechild = firebase.Child("test"); // Of same type! 
firebasechild.DoStuff(); 

ich versuche, eine ähnliche Funktionalität in meinem Viewmodel zu erhalten:

firebase = Mvx.Resolve<IFirebaseConnection>(); 
firebase.FirebaseConnection ("URI"); 
IFirebaseConnection firebasechild = firebase.Child("test"); 
firebasechild.DoStuff(); 

der entsprechende Teil der meine Schnittstelle in meinem PCL ist :

public interface IFirebaseConnection 
{ 
    void FirebaseConnection (string URI); 

    IFirebaseConnection Child(string child); // Probably wrong? 

    void DoStuff(); 
} 

Meine setup.cs in meinem Android UI-Projekt enthält:

Mvx.RegisterType<IFirebaseConnection, FirebaseDroid>(); 

Die in Android spezifische Implementierungsplattform ist:

public class FirebaseDroid : IFirebaseConnection 
{ 
    protected Firebase firebase; 

    public void FirebaseConnection (string URI) 
    { 
     var mvxTopActivity = Mvx.Resolve<IMvxAndroidCurrentTopActivity>(); 
     Firebase.SetAndroidContext (mvxTopActivity.Activity); 
     firebase = new Firebase (URI); 
    } 

    public IFirebaseConnection Child (string child) 
    { 
     return firebase.Child (child); // This is obviously wrong 
    } 

    public void DoStuff(){// do something} 
} 

Die oben ist offensichtlich falsch, da firebase.Child() ist von Geben Sie "Firebase" und nicht "IFirebaseConnection" oder wahrscheinlich "FirebaseDroid" ein. Gibt es eine Möglichkeit, mit Methoden des gleichen Typs wie der Klasse umzugehen, in der plattformspezifische Dienste implementiert sind?

Antwort

1

Sie könnten einen neuen privaten Konstruktor einführen.

public class FirebaseDroid : IFirebaseConnection 
{ 
    protected Firebase firebase; 

    public FirebaseConnection() {} 

    private FirebaseConnection (Firebase firebase) 
    { 
     SetFirebase(firebase); 
    } 

    public void FirebaseConnection (string URI) 
    { 
     SetFirebase(new Firebase (URI)); 
    }  

    private void SetFirebase(Firebase firebase) 
    { 
     var mvxTopActivity = Mvx.Resolve<IMvxAndroidCurrentTopActivity>(); 
     Firebase.SetAndroidContext (mvxTopActivity.Activity); 
     this.firebase = firebase; 
    } 

    public IFirebaseConnection Child (string child) 
    { 
     return new FirebaseConnection(firebase.Child (child)); 
    } 

    public void DoStuff(){// do something} 
} 
Verwandte Themen