您好我尝试将我的类注册到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
我错了 感谢
答案 0 :(得分:1)
UnitOfWorkItem
属性正在查找已注册的UnitOfWork
。但是你永远不会在那个班级注册任何东西,你注册了IUnitOfWork
!
您需要通过将UnitOfWorkItem
更改为UnitOfWork
来修复IUnitOfWork
:
public UnitOfWork UnitOfWorkItem
{
get
{
return ServiceLocator.Current.GetInstance<IUnitOfWork>();
}
}
更好:
仅为了您的信息,IoC容器的强大之处在于您可以链接注册。例如,在您的情况下,您的LoginViewModel
和MainViewModel
需要UnitOfWork
作为构造函数参数。
如果您同时注册UnitOfWork
,MainViewModel
和LoginViewModel
:
SimpleIoc.Default.Register<UnitOfWork>();
SimpleIoc.Default.Register<LoginViewModel>();
SimpleIoc.Default.Register<MainViewModel>();
容器会自动向ViewModels
构造函数提供注册的UnitOfWork
等等。
这样您就不需要创建一个属性来获取UnitOfWork以将其提供给LoginViewModel构造函数。