相关疑难解决方法(0)

SimpleIoc - 它是否可以在每次需要时提供新实例?

据我所知,SimpleIoc使用GetInstance方法来检索已注册的类的实例.如果实例不存在,它将创建它.但是,此实例被缓存并始终检索,这模仿单例模式.

我的想法是,如果这个ViewModel需要两次的可能性很小,就没有必要在内存中保留ViewModel的实例,所以我想在每次需要时创建它的新实例.如果我们有一个ViewModel工厂,我们将拥有这样的属性:

public MyViewMOdel MyViewModel
{
    get { return SimpleIoc.Default.GetInstance<MyViewModel>(); }
}
Run Code Online (Sandbox Code Playgroud)

这个使用单例模式,我认为在所有情况下都不是最佳实践.为了避免这个问题,我这样做:

public MyViewModel MyViewModel
{
    get { return new MyViewModel(SimpleIoc.Default.GetInstance<ISomeInterface>()); }
}
Run Code Online (Sandbox Code Playgroud)

这个有一个缺点,如果我更改了MyViewModel的构造函数,我还需要更新此属性.没什么大不了的,但仍有某种依赖性.

你如何处理这种情况,我有什么遗漏?以及为什么决定不返回非共享实例.

另一个问题是,在MVVM Deep dive会话中,Laurent在注册特定的ViewModel之后立即使用GetInstance方法,正如他所说的那样,确保容器中已存在此ViewModel的实例.为什么这有必要?如果您通过ViewModelLocator获取ViewModel,那么您将在需要时创建它.那么我为什么要提前创建它们呢?

mvvm mvvm-light silverlight-5.0 c#-4.0

19
推荐指数
1
解决办法
9080
查看次数

导航和重新调整页面/ viewmodel构造函数

我正在使用Galasoft Mvvm Light工具包,在Windows手机的MVVM模式中构建我的应用程序.我必须每个页面都有自己的viewmodel.

当用户启动应用程序时,他可以选择新游戏og旋转问题页面.这些页面每个都有一个viewmodel,一切都使用viewmodellocator.然后,当用户再次导航以在新游戏和问题之间进行选择时.视图模型/页面未被删除.这意味着当用户第二次进入问题或新游戏时,不会调用viewmodel的构造函数,这样就不会运行构造函数中的初始化,并且未正确设置视图.

解决方案我试过了

我尝试删除导航中的后台堆栈,例如新游戏或问题的新导航,应该启动新页面,从而调用构造函数.不工作.

在视图中使用加载的事件,并调用构造函数.不工作.

试图按照 如何重置IOC容器中的所有实例 但无法使其工作,可能只是我.

有没有人解决这个问题,如果是这样,应该如何解决?

代码 在这里你可以找到一个例子.按问题,然后按一下那里的按钮,使用返回键.并再次按下问题.你看到这个数字现在是1,这很容易改变.但是再次按下按钮时会出现错误.突然出现两个弹出窗口.

那么设置viewmodel的正确方法是什么.因为新游戏的视图将在重新加载旧游戏时使用,仅使用其他值,并且当想要开始新游戏时.希望你能理解 :)

此示例仅用于显示每次返回viewmodel页面时弹出窗口计数上升的问题. https://www.dropbox.com/s/gjbz0l8rmsxqzrd/PhoneApp8.rar

ViewModel Locator 我在我当前的项目中使用了以下代码中的三个viewmodel:

using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Ioc;
using Microsoft.Practices.ServiceLocation;

namespace MVVMTestApp.ViewModel
{
public class ViewModelLocator
{
    public ViewModelLocator()
    {
        //Holder styr på ViewModels
        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

        //Tilføj linje her for hver ViewModel
        SimpleIoc.Default.Register<MainViewModel>();
        SimpleIoc.Default.Register<MainViewModelTest>();
        SimpleIoc.Default.Register<MenuViewModel>();
    }

    //Tilføj metode som denne for hver ViewModel
    public MainViewModel Map
    {
        get
        {
            return ServiceLocator.Current.GetInstance<MainViewModel>();
        }
    }

    public MainViewModelTest Main
    {
        get
        {
            return ServiceLocator.Current.GetInstance<MainViewModelTest>();
        }
    } …
Run Code Online (Sandbox Code Playgroud)

c# ioc-container mvvm windows-phone-8

5
推荐指数
1
解决办法
1416
查看次数