在Unity中,注册单例实例的两种方法有什么区别?
问题描述:
在团结,因为我知道我可以使用下面的2个选项来注册一个单例:在Unity中,注册单例实例的两种方法有什么区别?
IConfiguration globalConfig = new Configuration();
container.RegisterInstance<IConfiguration>(globalConfig);
container.RegisterType<IConfiguration, Configuration>(new ContainerControlledLifetimeManager());
是否有这两种方式有什么区别?什么是注册单例实例的首选方法?
答
第一种方式注册一个实例。当你这样做时,你必须创建对象的实例。
第二种方式不是单身。这是一个“通过容器或其任何子容器进行任何解决方案的单身人士”。第一次将要解决的问题将“修复对象的状态”并在LifetimeManager
内注册任何进一步的解决方案。
例如,假设你有下面的类:
class AA
{
public Datetime When { get; set; }
public AA()
{
this.When = Datetime.Now;
}
}
在第一种情况下,When
将是登记前,在第二种情况下这将是只要你真正解决该类型/接口。
答
在第一种情况下,您注册了类型的实例。 所以,这个实例的字段和属性都被修改了,直到你注册了他,因为这个,你可以注册一些单身的“状态”。 Hovewer,你需要注册单例状态是一个非常奇怪的行为。
在第二种情况下,您注册了类型,但未注册某些对象状态。当然,您可以使用特定的属性或注入参数来设置新实例的状态。
IUnityContainer.RegisterInstance使用ContainerControlledLifetimeManager默认情况下,如果不指定其他,见Lifetime Managers。你的两个案例是相同的。 Hovewer,两种情况下都不会注册一个单例。 我的意思是你可以为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对象,但获得等于对象为同一registerName:
// 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");
我希望它对你有所帮助。
这是一个很好的例子来解释2个选项之间的区别 – Tony98