在MvvmCross Android中创建单例视图模型实例

时间:2015-09-17 18:39:19

标签: c# android caching xamarin mvvmcross

我正在使用MvvmCross来开发我的Android应用。我希望有一个特定ViewModel的Singleton实例。为此,我尝试以this link

中提到的类似方式实施

以下是我的App.cs中的代码

public class App : Cirrious.MvvmCross.ViewModels.MvxApplication
{
    public override void Initialize()
    {
        CreatableTypes()
            .EndingWith("Service")
            .AsInterfaces()
            .RegisterAsLazySingleton();

        RegisterAppStart(new AppStart());
    }

    protected override Cirrious.MvvmCross.ViewModels.IMvxViewModelLocator CreateDefaultViewModelLocator()
    {
        return MyViewModelLocator ();
    }
}

public class MyViewModelLocator : MvxDefaultViewModelLocator
{
    public MyViewModelLocator()
    {
    }

    public override IMvxViewModel Load(System.Type viewModelType, IMvxBundle parameterValues, IMvxBundle savedState)
    {
        if (viewModelType.GetType() == typeof(CartViewModel))
        {
            var cache = Mvx.Resolve<IMvxMultipleViewModelCache>();
            var cachedViewModel = cache.GetAndClear(viewModelType);

            if (cachedViewModel == null)
                cachedViewModel = base.Load(viewModelType, parameterValues, savedState);

            cache.Cache(cachedViewModel);

            return cachedViewModel;
        }
        else
        {
            return base.Load(viewModelType, parameterValues, savedState);
        }
    }
}

但不管怎样,有了这个实现,它无法从缓存和缓存中获取ViewModel .GetAndClear调用总是在ViewModelLocator实现中返回null。除了这个地方,我不会从我的代码中调用任何其他地方的缓存,所以想知道它是如何从缓存中删除的。

另外,我想知道为什么我根本无法使用IOC(即Mvx.RegisterSingleton<ViewModelName>()Mvx.Resolve<ViewModelName>())来获取单例实例而不是缓存? MvvmCross的内部实现使用缓存而不是IOC。

0 个答案:

没有答案