как внедрить сервис для просмотра модели в mvvm light

Я пытаюсь использовать внедрение зависимостей для внедрения службы в модель представления. попробуйте этот код

ViewModelLocator

public class ViewModelLocator
    {
        public static MainViewModel _main;

        static ViewModelLocator()
        {
            ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);


            SimpleIoc.Default.Register<IAccountService, AccountService>();

            SimpleIoc.Default.Register<MainViewModel>();
            SimpleIoc.Default.Register<LoginViewModel>();
        }

        /// <summary>
        /// Gets the Main property.
        /// </summary>
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance",
            "CA1822:MarkMembersAsStatic",
            Justification = "This non-static member is needed for data binding purposes.")]
        public IMainViewModel Main
        {
            get
            {
                return ServiceLocator.Current.GetInstance<IMainViewModel>();
            }
        }

        /// <summary>
        /// Gets the Main property.
        /// </summary>
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance",
            "CA1822:MarkMembersAsStatic",
            Justification = "This non-static member is needed for data binding purposes.")]
        public LoginViewModel Login
        {
            get
            {
                return ServiceLocator.Current.GetInstance<LoginViewModel>();
            }
        }

        /// <summary>
        /// Cleans up all the resources.
        /// </summary>
        public static void Cleanup()
        {

        }
    }

MainViewModel

public interface IMainViewModel
    {

    }
    public class MainViewModel : ViewModelBase
    {
        private readonly IAccountService _accountService;

        /// <summary>
        /// Initializes a new instance of the MainViewModel class.
        /// </summary>
        public MainViewModel(IAccountService accountService)
        {
            _accountService = accountService;
        }
    }

мой LoginViewModel

public interface ILoginViewModel
{
    ICommand Authorize { get; set; }
}
public class LoginViewModel : ViewModelBase, IMainViewModel
{

    private IAccountService _accountService;

    public LoginViewModel(IAccountService _accountService)
    {
        this._accountService = _accountService;
        Authorize = new RelayCommand(() => CheckAuthorized(), () => true);
    }

    public ICommand Authorize { get; private set; } 

}

и это мой LoginView

public partial class Login : UserControl
{
    ILoginViewModel _loginViewModel;
    public Login(ILoginViewModel _loginViewModel)
    {
        this._loginViewModel = _loginViewModel;
        InitializeComponent();
        DataContext = _loginViewModel;
    }
}

У меня вопрос: когда я пытаюсь ввести в свое представление, ссылка на объект равна нулю, как я могу использовать DI в mvvm light?


person novian kristianto    schedule 06.06.2014    source источник
comment
Я запутался; заголовок вашего вопроса подразумевает, что вы пытаетесь вставить AccountService в LoginViewModel, но ваш комментарий в конце подразумевает, что вы пытаетесь вставить его в LoginView. Что он?   -  person Jason Baker    schedule 06.06.2014
comment
о, извините, моя вина, я имею в виду LoginViewModel   -  person novian kristianto    schedule 06.06.2014


Ответы (1)


Вы пытаетесь ввести ILoginViewModel в представление входа в систему, но похоже, что ILoginViewModel не зарегистрирован, поэтому вам может потребоваться зарегистрировать тот же

    static ViewModelLocator()
    {
        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);


        SimpleIoc.Default.Register<IAccountService, AccountService>();

        SimpleIoc.Default.Register<IMainViewModel, MainViewModel>(); //register view models
        SimpleIoc.Default.Register<ILoginViewModel, LoginViewModel>();
    }

спасибо @Jason за указание на это

возможно, по ошибке LoginViewModel реализует IMainViewModel вместо ILoginViewModel

так что нужно исправить таким образом

public class LoginViewModel : ViewModelBase, ILoginViewModel
{
    ...
}

также реализует IMainViewModel в MainViewModel, чтобы разрешить его через контейнер

public class MainViewModel : ViewModelBase, IMainViewModel 
{
    ...
}
person pushpraj    schedule 06.06.2014
comment
Также существует проблема, что LoginViewModel не реализует ILoginViewModel. Я слишком устал, чтобы придумывать для этого правильную структуру наследования, но я знаю, что виртуальные машины должны реализовывать свои интерфейсы - и, если я не ошибаюсь, LoginViewModel должен наследовать от MainViewModel, а не реализовывать IMainViewModel. Но я мог ошибаться насчет последнего - person Jason Baker; 06.06.2014