后台:我正在尝试使用其特定于平台的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”。有没有办法处理与实现特定于平台的服务时类相同类型的方法?
答案 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}
}