2017-02-19 35 views
0

我想注入一個列表,我的視圖模型構造與服務定位MVVM光simpleIoc構造函數注入

我的視圖模型:

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

    public ShowEmployeeViewModel(IList<IEmployee> emp) 
    { 

     this._empl = emp; 

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

我的服務定位:

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:當我嘗試一個登記簿列表「的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

它的工作原理,但不會打破依賴注入的目的,我怎麼能註冊一個類型的接口?謝謝 –

+0

您不會將通用列表映射到特定類型。這是沒有意義的,因爲你希望能夠爲許多不同類型使用通用列表。您可以映射視圖模型界面,例如IShowViewModel,而不是具體的視圖模型類型,但這是另一回事,因爲你的ShowEmployeeViewModel類甚至沒有實現一個接口,所以這裏不適用。 – mm8

+0

感謝您的幫助 –