具有MVVMlight的SimpleIOC注册并使用

时间:2017-06-08 11:31:36

标签: c# wpf mvvm-light service-locator simpleioc

您好我尝试将我的类注册到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抛出异常的函数时:

  

在缓存中找不到类型:Client.Business.UnitOfWork。

我的堆栈跟踪是:

  

in GalaSoft.MvvmLight.Ioc.SimpleIoc.DoGetService(输入serviceType,   字符串键,布尔缓存)   d:\ GalaSoft \ mydotnet \ MVVMLight \源\ GalaSoft.MvvmLight \ GalaSoft.MvvmLight.Extras   (PCL)\ Ioc \ SimpleIoc.cs:riga 537 in   GalaSoft.MvvmLight.Ioc.SimpleIoc.GetInstanceTService in   d:\ GalaSoft \ mydotnet \ MVVMLight \源\ GalaSoft.MvvmLight \ GalaSoft.MvvmLight.Extras   (PCL)\ Ioc \ SimpleIoc.cs:riga 912 in   PrivateVideoChat.Client.ViewModel.ViewModelLocator.get_UnitOfWorkItem()   在C:\ Users \ c.fasolin \ Documents \ Visual Studio中   2013 \项目\ PrivateVideoChat.Solution \ PrivateVideoChat.Client \视图模型\ ViewModelLocator.cs:里加   63英寸   PrivateVideoChat.Client.ViewModel.ViewModelLocator。&lt; .ctor&gt; b__0_1()in   C:\ Users \ c.fasolin \ Documents \ Visual Studio   2013 \项目\ PrivateVideoChat.Solution \ PrivateVideoChat.Client \视图模型\ ViewModelLocator.cs:里加   52

我错了 感谢

1 个答案:

答案 0 :(得分:1)

UnitOfWorkItem属性正在查找已注册的UnitOfWork。但是你永远不会在那个班级注册任何东西,你注册了IUnitOfWork

您需要通过将UnitOfWorkItem更改为UnitOfWork来修复IUnitOfWork

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构造函数。