2017-06-01 2 views
1

.Register()が複数回実行されたことを知りたいと思います。私の実験に基づいて、Console.WriteLineは同じInitの値を与えます。MVVMLight SimpleIocが複数回登録されたときにはどうなりましたか?

したがって、.Register()は既に登録されたインスタンスをチェックし、を無視して再登録しますか?

void Main() 
{ 
    // #1 
    SimpleIoc.Default.Register<TestClass>(); 
    Console.WriteLine(SimpleIoc.Default.GetInstance<TestClass>().Init); 

    // #2 
    SimpleIoc.Default.Register<TestClass>(); 
    Console.WriteLine(SimpleIoc.Default.GetInstance<TestClass>().Init); 

    // Result: #1 and #2 give identical Init value. 
} 

public class TestClass 
{ 
    public string Init { get; set;} 
    public TestClass() 
    { 
     Init = Guid.NewGuid().ToString(); 
    } 
} 
+0

この現象についての公式なドキュメントが必要ですか? – Evk

+0

@Evk //それは素晴らしいだろう:)私はこの投稿の質問者でした。 https://stackoverflow.com/q/13795596/361100 – Youngjae

+0

ソースコードを見ると、記述したとおりに動作することは明らかですが(一度だけ登録します)、それに関する正式な文書はないと思います。 – Evk

答えて

1

逆コンパイルすることにより、Registerメソッドのソースコードを見て、それであれば(あなたが見つけることができない場合には\実際のソースコードを気にしたくない)、あなたは(関係ない部分はスキップして)表示されます。

public void Register<TClass>(bool createInstanceImmediately) where TClass : class 
{ 
    Type index = typeof (TClass); 
    // skipped irrelevant parts 
    if (this._factories.ContainsKey(index) && this._factories[index].ContainsKey(this._defaultKey)) 
    { 
    if (!this._constructorInfos.ContainsKey(index)) 
     throw new InvalidOperationException(string.Format((IFormatProvider) CultureInfo.InvariantCulture, "Class {0} is already registered.", (object) index)); 
    } else { 
     if (!this._interfaceToClassMap.ContainsKey(index)) 
     this._interfaceToClassMap.Add(index, (Type) null); 
     this._constructorInfos.Add(index, this.GetConstructorInfo(index)); 
     Func<TClass> factory = new Func<TClass>(this.MakeInstance<TClass>); 
     this.DoRegister<TClass>(index, factory, this._defaultKey); 
     if (!createInstanceImmediately) 
     return; 
     this.GetInstance<TClass>(); 
    } 
    } 
} 

_factoriesディクショナリに既に登録されているファクトリがある場合、この型に登録されているコンストラクタ情報があるかどうかをチェックし、そうでない場合は、すでに登録されているクラスについて例外をスローします。私はこれがタイプミスであり、チェックが逆でなければならないと思います。既に登録されているコンストラクタ(elseブロックに登録)がある場合は、すでに登録されているクラスについて例外があります。しかし、今実装されているので、2回目の登録をしようとすると何もしません。

関連する問題