【问题标题】:MVVMCross Platform specific class that has method which returns instance of same class具有返回同一类实例的方法的 MVVMCross 平台特定类
【发布时间】:2016-05-19 19:23:39
【问题描述】:

背景:我正在尝试使用 Firebase 特定平台的 SDK 将 Firebase 集成到我的 MVVMCross 应用中。我的设置的基本部分正在工作,即我可以使用基本的 Firebase 功能从我的视图模型中的 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();

我正在尝试在我的视图模型中获得类似的功能:

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”。在实现特定平台的服务时,有没有办法处理与它所在的类相同类型的方法?

【问题讨论】:

    标签: android xamarin firebase mvvmcross


    【解决方案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}
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-11
      • 2015-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-11
      相关资源
      最近更新 更多