SimpleIOC с MVVMlight зарегистрироваться и использовать
Привет я пытаюсь зарегистрировать свой класс в 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.
моя трассировка стека:
в GalaSoft.MvvmLight.Ioc.SimpleIoc.DoGetService (введите serviceType, строковый ключ, логический кэш) в D:\GalaSoft\mydotnet\MVVMLight\source\GalaSoft.MvvmLight\GalaSoft.MvvmLight.Extras \ Iococ (PCL):riga 537 в GalaSoft.MvvmLight.Ioc.SimpleIoc.GetInstanceTService в D:\GalaSoft\mydotnet\MVVMLight\source\GalaSoft.MvvmLight\GalaSoft.MvvmLight.Extras (PCL)\Ioc\SimpleIoc..ViewModel.ViewModelLocator.get_UnitOfWorkItem() в C:\Users\c.fasolin\Documents\Visual Studio 2013\Projects\PrivateVideoChat.Solution\PrivateVideoChat.Client\ViewModel\ViewModelLocator.cs:riga 63 в PrivateVideoChat.Client.ViewLodel.ViewModel.LodeViewModelodel.ViewModel.ViewModel.ViewModel.ViewModel.ViewModel.ViewModel.Lock.<. ctor>b__0_1 () в C:\Users\c.fasolin\Documents\Visual Studio 2013\Projects\PrivateVideoChat.Solution\PrivateVideoChat.Client\ViewModel\ViewModelLocator.cs:riga 52
Где я не прав спасибо
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.