2016-07-21 77 views
0

這是演示我的問題的示例代碼。爲了簡單起見,我刪除了其他不相關的代碼。在IoC(構造函數注入)中,什麼時候創建了注入構造函數的實例?

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

     if (ViewModelBase.IsInDesignModeStatic) 
     { 
      SimpleIoc.Default.Register<IDataService, DesignDataService>(); 
     } 
     else 
     { 
      SimpleIoc.Default.Register<IDataService, DataService>(); 

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

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

根據我在代碼理解以上,如果應用程序是在設計模式中,當一個方法/構造函數需要類型IDataService的參數,DesignDataService的實例被作爲參數傳遞否則DataService的實例。現在,我的問題是什麼時候創建了IDataService類型的實例? IDataService類型的對象是否有可能在其構造函數中有一個參數? PS:我是wpf,MVVM模式和Ioc的概念的新手。所以請簡單說明一下。謝謝。

回答

0

這個實例是懶惰創建的,所以它在第一次訪問時創建。在某種程度上,它像Singleton模式一樣工作。但是,所有服務都在相同的服務定位器中進行管理。

下面是一個簡單的定位減去參數衛士:

public static class Locator 
{ 
    private static Dictionary<Type, Lazy<object>> _cache = new Dictionary<Type, Lazy<object>>(); 

    public static void Register<TService, TProvider>() 
     where TService : TProvider 
     where TProvider : new() 
    { 
     _cache.Add(typeof(TService), new Lazy<object>(() => new TProvider())); 
    } 

    public static TService GetInstance<TService>() 
    { 
     return (TService)_cache[typeof(TService)].Value; 
    } 
} 

至於參數的構造函數,你可以這樣他們註冊:

SimpleIoc.Default.Register<IService>(() => new RealService(param1, param2));