在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将是登记前,在第二种情况下这将是只要你真正解决该类型/接口。

+0

这是一个很好的例子来解释2个选项之间的区别 – Tony98

在第一种情况下,您注册了类型的实例。 所以,这个实例的字段和属性都被修改了,直到你注册了他,因为这个,你可以注册一些单身的“状态”。 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"); 

我希望它对你有所帮助。