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.

Другие вопросы по тегам