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

C# 在MvvmCross Android中创建单例视图模型实例,c#,android,caching,xamarin,mvvmcross,C#,Android,Caching,Xamarin,Mvvmcross,我正在使用MvvmCross开发我的Android应用程序。在这方面,我希望有一个特定ViewModel的单例实例。为此,我尝试以与上所述类似的方式实现 以下是我在App.cs中的代码 public class App : Cirrious.MvvmCross.ViewModels.MvxApplication { public override void Initialize() { CreatableTypes() .EndingWit

我正在使用
MvvmCross
开发我的Android应用程序。在这方面,我希望有一个特定
ViewModel
的单例实例。为此,我尝试以与上所述类似的方式实现

以下是我在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);
        }
    }
}
公共类应用程序:cirries.MvvmCross.ViewModels.MvxApplication
{
公共覆盖无效初始化()
{
createabletypes()
.以“服务”结尾
.a接口()
.registeraslazyingleton();
RegisterAppStart(新AppStart());
}
受保护的覆盖Cirries.MvvmCross.ViewModels.IMvxViewModelLocator CreateDefaultViewModelLocator()
{
返回MyViewModelLocator();
}
}
公共类MyViewModelLocator:MvxDefaultViewModelLocator
{
公共MyViewModelLocator()
{
}
公共覆盖IMvxViewModel加载(System.Type viewModelType、IMvxBundle参数值、IMvxBundle保存状态)
{
if(viewModelType.GetType()==typeof(CartViewModel))
{
var cache=Mvx.Resolve();
var cachedViewModel=cache.GetAndClear(viewModelType);
if(cachedViewModel==null)
cachedViewModel=base.Load(viewModelType、ParameterValue、savedState);
cache.cache(cachedViewModel);
返回cachedViewModel;
}
其他的
{
返回base.Load(viewModelType、ParameterValue、savedState);
}
}
}
但不知何故,有了这个实现,它无法从缓存和缓存中获取ViewModel。GetAndClear调用在
ViewModelLocator
实现中始终返回null。除了这个地方,我不会从我的代码的任何其他地方调用缓存,所以我想知道它为什么会从缓存中删除


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

我认为IMvxMultipleViewModelCache只用于片段内容。所以一定要检查IMvxSingleViewModelCache缓存。但正如名称所示,它只缓存一个VM。@Cheesebaron我试图从IMvxSingleViewModelCache获取my viewmodel实例,但它没有我要查找的实例。此外,在我的代码中,我没有缓存任何viewmodels,它仅由mvvmcross框架代码完成。我没有使用缓存,而是使用IOC获取我的实例(在VMLocator实现中),它确实返回了我的singleton viewmodel实例。所以我想知道我应该继续这样使用吗?困扰我的一个问题是,为什么框架使用缓存而不是从IOC获取实例?是否仍有修改此行为的方法?为什么不使用IoC来定位我不知道的ViewModels。只有原作者知道这一点。可能有原因,也可能没有。如果您觉得应该这样做,欢迎您在MvvmCross存储库中创建一个请求。您已经找到了修改行为的方法。重写类中找到的方法并注册它们。我会看看这里: