在Unity中,两种注册单例实例的方式有什么区别?
In Unity, what is the difference between the 2 ways to register a singleton instance?
在 Unity 中,据我所知,我可以使用以下 2 个选项来注册单例实例:
IConfiguration globalConfig = new Configuration();
container.RegisterInstance<IConfiguration>(globalConfig);
container.RegisterType<IConfiguration, Configuration>(new ContainerControlledLifetimeManager());
这两种方式有什么区别吗?注册单例实例的首选方式是什么?
第一种方式注册一个实例。执行此操作时必须创建对象的实例。
第二种方式不是单例。这是一个"singleton for any resolution by the container or any of it's child containers"。第一次将解决对象的 "fix the state" 并在 LifetimeManager
.
内注册任何进一步的解决方案
例如,假设您有以下 class:
class AA
{
public Datetime When { get; set; }
public AA()
{
this.When = Datetime.Now;
}
}
在第一种情况下,When
将在注册之前,在第二种情况下,它将在您实际解决该问题时 type/interface。
在第一种情况下,您注册了一些 类型 的实例。
因此,这个实例的字段和属性在您注册他之前一直在修改,因此您可以注册一些 "state" 的单例。但是,您需要注册单例状态是一种非常奇怪的行为。
在第二种情况下,您注册了一个 type,但没有注册对象的某些状态。当然,您可以使用特定的属性或注入参数来设置新实例的状态。
IUnityContainer.RegisterInstance默认使用ContainerControlledLifetimeManager,如果不指定其他,参见Lifetime Managers。你的两个案例是相同的。但是,这两种情况都没有注册单身人士。
我的意思是您可以为 IConfiguration 注册许多不同的对象:
IConfiguration globalConfig = new Configuration();
IConfiguration localConfig = new Configuration();
container.RegisterInstance<IConfiguration>("globalConfig", globalConfig);
container.RegisterInstance<IConfiguration>("localConfig", localConfig);
...
container.RegisterType<IConfiguration, Configuration>("localConfig", new ContainerControlledLifetimeManager());
container.RegisterType<IConfiguration, Configuration>("globalConfig", new ContainerControlledLifetimeManager());
对于不匹配的 registerName,您得到的不是 equals 对象,而是对于相同的 registerName 得到的 equals 对象:
// This objects does not equal in both cases
IConfiguration globalConfig = container.Resolve<IConfiguration>("globalConfig");
IConfiguration localConfig = container.Resolve<IConfiguration>("localConfig");
....
// This objects equals in both cases
IConfiguration globalConfig1 = container.Resolve<IConfiguration>("globalConfig");
IConfiguration globalConfig2 = container.Resolve<IConfiguration>("globalConfig");
希望对你有所帮助
在 Unity 中,据我所知,我可以使用以下 2 个选项来注册单例实例:
IConfiguration globalConfig = new Configuration();
container.RegisterInstance<IConfiguration>(globalConfig);
container.RegisterType<IConfiguration, Configuration>(new ContainerControlledLifetimeManager());
这两种方式有什么区别吗?注册单例实例的首选方式是什么?
第一种方式注册一个实例。执行此操作时必须创建对象的实例。
第二种方式不是单例。这是一个"singleton for any resolution by the container or any of it's child containers"。第一次将解决对象的 "fix the state" 并在 LifetimeManager
.
例如,假设您有以下 class:
class AA
{
public Datetime When { get; set; }
public AA()
{
this.When = Datetime.Now;
}
}
在第一种情况下,When
将在注册之前,在第二种情况下,它将在您实际解决该问题时 type/interface。
在第一种情况下,您注册了一些 类型 的实例。 因此,这个实例的字段和属性在您注册他之前一直在修改,因此您可以注册一些 "state" 的单例。但是,您需要注册单例状态是一种非常奇怪的行为。
在第二种情况下,您注册了一个 type,但没有注册对象的某些状态。当然,您可以使用特定的属性或注入参数来设置新实例的状态。
IUnityContainer.RegisterInstance默认使用ContainerControlledLifetimeManager,如果不指定其他,参见Lifetime Managers。你的两个案例是相同的。但是,这两种情况都没有注册单身人士。 我的意思是您可以为 IConfiguration 注册许多不同的对象:
IConfiguration globalConfig = new Configuration();
IConfiguration localConfig = new Configuration();
container.RegisterInstance<IConfiguration>("globalConfig", globalConfig);
container.RegisterInstance<IConfiguration>("localConfig", localConfig);
...
container.RegisterType<IConfiguration, Configuration>("localConfig", new ContainerControlledLifetimeManager());
container.RegisterType<IConfiguration, Configuration>("globalConfig", new ContainerControlledLifetimeManager());
对于不匹配的 registerName,您得到的不是 equals 对象,而是对于相同的 registerName 得到的 equals 对象:
// This objects does not equal in both cases
IConfiguration globalConfig = container.Resolve<IConfiguration>("globalConfig");
IConfiguration localConfig = container.Resolve<IConfiguration>("localConfig");
....
// This objects equals in both cases
IConfiguration globalConfig1 = container.Resolve<IConfiguration>("globalConfig");
IConfiguration globalConfig2 = container.Resolve<IConfiguration>("globalConfig");
希望对你有所帮助