在Unity中,据我所知,我可以使用以下两个选项来注册单例实例:
IConfiguration globalConfig = new Configuration();
container.RegisterInstance<IConfiguration>(globalConfig);
container.RegisterType<IConfiguration, Configuration>(new ContainerControlledLifetimeManager());
这两种方式有什么区别吗?注册单例实例的首选方法是什么?
答案 0 :(得分:8)
第一种方式注册实例。您必须在执行此操作时创建对象的实例。
第二种方式不是单身人士。对于容器或其任何子容器的任何解决方案,它都是一个单一的容器&#34;。第一次它将永远解决将修复状态&#34;在LifetimeManager
。
例如,假设您有以下课程:
class AA
{
public Datetime When { get; set; }
public AA()
{
this.When = Datetime.Now;
}
}
在第一种情况下,When
将在注册之前,在第二种情况下,只要您真正解析该类型/接口,就会出现这种情况。
答案 1 :(得分:1)
在第一种情况下,您注册了一些类型的实例。 因此,此实例的字段和属性已被修改,直到您注册他为止,因此您可以注册一些单身的“状态”。 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的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");
我希望它对你有帮助。