SimpleIOC 与 MVVMlight 的注册与使用

SimpleIOC with MVVMlight register and use

您好,我尝试将我的 class 注册到 serviceLocator 中并重新使用它,我的代码是:

public ViewModelLocator()
{
    ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

    SimpleIoc.Default.Register<IUnitOfWork, UnitOfWork>(true);

    SimpleIoc.Default.Register<MainViewModel>(() =>
    {
        return new MainViewModel(UnitOfWorkItem);
    });
    SimpleIoc.Default.Register<LoginViewModel>(() =>
    {
        return new LoginViewModel(UnitOfWorkItem);
    });
}

public UnitOfWork UnitOfWorkItem
{
    get
    {
        return ServiceLocator.Current.GetInstance<UnitOfWork>();
    }
}

public MainViewModel Main
{
    get
    {
        return ServiceLocator.Current.GetInstance<MainViewModel>();
    }
}

当我尝试将 UnitOfWorkItem 赋给函数时,实例 MainViewModel 抛出如下异常:

Type not found in cache: Client.Business.UnitOfWork.

我的堆栈跟踪是:

in GalaSoft.MvvmLight.Ioc.SimpleIoc.DoGetService(Type serviceType, String key, Boolean cache) in D:\GalaSoft\mydotnet\MVVMLight\source\GalaSoft.MvvmLight\GalaSoft.MvvmLight.Extras (PCL)\Ioc\SimpleIoc.cs:riga 537 in GalaSoft.MvvmLight.Ioc.SimpleIoc.GetInstanceTService in D:\GalaSoft\mydotnet\MVVMLight\source\GalaSoft.MvvmLight\GalaSoft.MvvmLight.Extras (PCL)\Ioc\SimpleIoc.cs:riga 912 in PrivateVideoChat.Client.ViewModel.ViewModelLocator.get_UnitOfWorkItem() in C:\Users\c.fasolin\Documents\Visual Studio 2013\Projects\PrivateVideoChat.Solution\PrivateVideoChat.Client\ViewModel\ViewModelLocator.cs:riga 63 in PrivateVideoChat.Client.ViewModel.ViewModelLocator.<.ctor>b__0_1() in C:\Users\c.fasolin\Documents\Visual Studio 2013\Projects\PrivateVideoChat.Solution\PrivateVideoChat.Client\ViewModel\ViewModelLocator.cs:riga 52

我哪里错了 谢谢

UnitOfWorkItem属性正在寻找已注册的UnitOfWork。但是你永远不会用 class 注册任何东西,你注册 IUnitOfWork

您需要通过将 UnitOfWork 更改为 IUnitOfWork:

来修复您的 UnitOfWorkItem
public UnitOfWork UnitOfWorkItem
{
    get
    {
        return ServiceLocator.Current.GetInstance<IUnitOfWork>();
    }
}

更好:

仅供参考,IoC 容器的强大之处在于您可以链接注册。例如,在您的情况下,您的 LoginViewModelMainViewModel 需要一个 UnitOfWork 作为构造函数参数。

如果您像这样同时注册 UnitOfWorkMainViewModelLoginViewModel

SimpleIoc.Default.Register<UnitOfWork>(); 
SimpleIoc.Default.Register<LoginViewModel>(); 
SimpleIoc.Default.Register<MainViewModel>(); 

容器会自动向ViewModels构造函数提供注册的UnitOfWork等等。

这样您就不需要创建 属性 获取 UnitOfWork 以将其提供给 LoginViewModel 构造函数。