如何使用SimpleIoC和Messenger for Lifetime Object(s)/ ViewModels?

时间:2016-02-19 09:33:42

标签: c# wpf mvvm inversion-of-control mvvm-light

我有一个用户登录的应用程序,代表一个"生命周期"对象,直到用户注销。我正在使用MVVM Light,但不知道如何正确使用SimpleIoC(使用Messenger)。
目前,我将对象保存在MainViewModel中作为我的自定义CurrentUser对象的User属性,并通过构造函数将其传递给其他ViewModel,并将其另存为Property。但是我有这个问题,在某些地方,对象被覆盖/创建新的。

这可能是错误的做法,因为我发现SimpleIoC可以简单地用GetInstance<>()返回已注册的实例,如果需要,还可以返回Key。 所以正确的方法是用Key创建一个User对象来获取所需的类,修改并保存它以便其他类在调用时可以得到更新的值(或者PropertyChanged可能吗?),对吗?

我试图像这样创建它,但对象显然没有更新:

public MainViewModel()
{
    RegisterMessenger();

    CurrentUser = SimpleIoc.Default.GetInstance<User>("123");
    _dataService = SimpleIoc.Default.GetInstance<IDataService>();

    Messenger.Default.Send(new NotificationMessage("GoToLoginPage"));
}

public User CurrentUser
{
    get { return _currentUser; }
    set { Set(ref _currentUser, value); }
}

public User CurrentPageViewModel
{
    get { return _currenPageViewModel; }
    set { Set(ref _currentPageViewModel, value); }
}

public void RegisterMessenger()
{
    Messenger.Default.Register<NotificationMessage>(this, message =>
    {
        switch (message.Notification)
        {
            case "GoToLoginPage":
                if (_loginViewModel == null)
                    _loginViewModel = new LoginViewModel(_dataService);

                CurrentPageViewModel = _loginViewModel;
                break;

            // Other cases...
        });
    }
}

// -------------------------------------------------------------------------

public LoginViewModel(IDataService dataService)
{
    UserObj = SimpleIoc.Default.GetInstance<User>("123");
    _dataService = dataService;

    LoginCommand = new RelayCommand(LoginExecute, LoginCanExecute);
}

如果我用GetInstance<SomeViewModel>()调用ViewModels,它会更好吗?但是,我如何将参数传递给它们并让它们保持 alive / recreate / destroy

如果有人能以正确的方式指出我,那就太好了,谢谢!

0 个答案:

没有答案