2016-07-21 4 views
0

これは私の質問を示すためのサンプルコードです。私は単純化のために他の無関係のコードを削除しました。アプリケーションはDesignDataServiceのインスタンスが他のパラメータとのDataServiceのインスタンスとして渡され、メソッド/コンストラクタはタイプIDataServiceのパラメータを必要とするとき、設計モードにある場合、上記のコードでは、私の理解に基づい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のインスタンスがいつ作成されるのですか? 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)); 
関連する問題