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 容器的强大之处在于您可以链接注册。例如,在您的情况下,您的 LoginViewModel
和 MainViewModel
需要一个 UnitOfWork
作为构造函数参数。
如果您像这样同时注册 UnitOfWork
、MainViewModel
和 LoginViewModel
:
SimpleIoc.Default.Register<UnitOfWork>();
SimpleIoc.Default.Register<LoginViewModel>();
SimpleIoc.Default.Register<MainViewModel>();
容器会自动向ViewModels
构造函数提供注册的UnitOfWork
等等。
这样您就不需要创建 属性 获取 UnitOfWork 以将其提供给 LoginViewModel 构造函数。
您好,我尝试将我的 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 容器的强大之处在于您可以链接注册。例如,在您的情况下,您的 LoginViewModel
和 MainViewModel
需要一个 UnitOfWork
作为构造函数参数。
如果您像这样同时注册 UnitOfWork
、MainViewModel
和 LoginViewModel
:
SimpleIoc.Default.Register<UnitOfWork>();
SimpleIoc.Default.Register<LoginViewModel>();
SimpleIoc.Default.Register<MainViewModel>();
容器会自动向ViewModels
构造函数提供注册的UnitOfWork
等等。
这样您就不需要创建 属性 获取 UnitOfWork 以将其提供给 LoginViewModel 构造函数。