2017-06-01 78 views
1

我想知道.Register()何時執行多次。根據我的實驗,在Console.WriteLine以下給出了相同的值InitMVVMLight 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字典 - 它會檢查是否有這種類型的,如果沒有登記的構造信息 - 拋出約已經註冊類異常。我想這是一個錯字,檢查應該顛倒 - 如果已經註冊構造函數(您在其他塊中註冊) - 應該有關於已註冊類的異常。但是現在它已經實施 - 當你嘗試第二次註冊時它什麼都不做。