MVVMCross Platform特定的类,它具有返回相同类

时间:2016-05-19 01:36:11

标签: android xamarin firebase mvvmcross

后台:我正在尝试使用其特定于平台的SDK将Firebase集成到我的MVVMCross应用中。我的设置的基本部分正在运行,即我可以使用基本的Firebase功能从我的viewmodel中检索Firebase数据库中的信息。它在我的PCL中使用一个接口,在UI项目中具有特定于平台的实现。

问题:但是,我想在我的界面(及其实现)中实现一个方法,该方法可以处理Firebase的Java SDK有一个名为“Firebase”的类的事实返回相同类型的方法(“Firebase”),例如Java SDK中的“Child”方法:

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

我正在尝试在我的viewmodel中获得类似的功能:

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

我的PCL界面的相关部分是:

public interface IFirebaseConnection
{
    void FirebaseConnection (string URI);

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

    void DoStuff();
}

我的Android UI项目中的setup.cs包含:

Mvx.RegisterType<IFirebaseConnection, FirebaseDroid>();

Android中的平台特定实现是:

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}
}

以上显然是错误的,因为firebase.Child()类型为“Firebase”而不是“IFirebaseConnection”,或者可能更准确地说是“FirebaseDroid”。有没有办法处理与实现特定于平台的服务时类相同类型的方法?

1 个答案:

答案 0 :(得分:1)

您可以引入一个新的私有构造函数。

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}
}