2017-02-19 2 views
0

я хочу, чтобы ввести список мой ViewModel конструктор с ServiceLocatorMVVM инъекции света simpleIoc конструктор

мой ViewModel:

public class ShowEmployeeViewModel: ViewModelBase 
{ 
    private IList<IEmployee> _empl; 

    public ShowEmployeeViewModel(IList<IEmployee> emp) 
    { 

     this._empl = emp; 

     _empl.Add(new Employee() { empName = "foo", enpFunction = "bar" }); 
    } 
} 

мой ServiceLocator:

public class ViewModelLocator 
{ 

    public ViewModelLocator() 
    { 

     ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); 

     //register the interface against the class 

     SimpleIoc.Default.Register < IList <IEmployee>, List <Employee>>(); 


     SimpleIoc.Default.Register<ShowEmployeeViewModel>(); 

    } 

    public MainViewModel Main 
    { 
     get 
     { 
      return ServiceLocator.Current.GetInstance<MainViewModel>(); 
     } 
    } 
    public ShowEmployeeViewModel ShowEmployee 
    { 
     get 
     { 
      return ServiceLocator.Current.GetInstance<ShowEmployeeViewModel>(); 
     } 
    } 

, когда я запускаю этот код Я получил ошибку: «Невозможно зарегистрировать: несколько конструкторов, найденных в List`1, но ни один из них не отмечен PreferredConstructor». PS: я только получил эту ошибку, когда я пытаюсь Registre список «IList», но когда я зарегистрировать свой интерфейс, как это:

SimpleIoc.Default.Register < IEmployee , Employee >(); 

она отлично работает, любая идея, как зарегистрировать список? заранее спасибо

+2

Вы Путаете здесь. Контейнер DI (и DI в целом) не предназначен для создания DTO и объектов; он предназначен для создания графиков компонентов приложения, то есть классов, которые содержат поведение этого приложения. 'ShowEmployeeViewModel' является DTO, а' IEmployee' является сущностью. Не регистрируйте их в контейнере. – Steven

ответ

2

Не отображать интерфейс IList, использовать фабрику для ShowEmployeeViewModel класса:

SimpleIoc.Default.Register(() => new ShowEmployeeViewModel(new List<IEmployee>())); 
+0

это работает, но разве это не победит цель Injection Dependency Injection, как я могу зарегистрировать тип против его интерфейса? спасибо –

+0

Вы не сопоставляете общий список с конкретным типом. Это не имеет смысла, поскольку вы хотите использовать общий список для разных типов. Вы можете сопоставить интерфейс модели представления, например. IShowViewModel, в отличие от конкретного типа модели просмотра, но это еще одна история, и поскольку ваш класс ShowEmployeeViewModel даже не реализует интерфейс, он здесь не применим. – mm8

+0

Благодарим вас за помощь –

Смежные вопросы