多次注册 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。但现在已实施 - 当您尝试第二次注册时,它什么也不做。
我想知道 .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。但现在已实施 - 当您尝试第二次注册时,它什么也不做。