多次注册 MVVMLight SimpleIoc 会发生什么?

what happened when MVVMLight SimpleIoc registered multiple times?

我想知道 .Register() 何时执行多次。根据我的实验,下面 Console.WriteLine 给出相同的 Init 值。

那么,.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();
    }
}

如果通过反编译查看 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 字典中已经注册了工厂 - 它会检查是否有为此类型注册的构造函数信息,如果没有 - 抛出有关已注册 class 的异常。我想这是一个错字,检查应该被逆转——如果已经注册了构造函数(你在 else 块中注册)——应该有关于已经注册的异常 class。但现在已实施 - 当您尝试第二次注册时,它什么也不做。