2017-05-31 41 views
1

在團結,因爲我知道我可以使用下面的2個選項來註冊一個單例:在Unity中,註冊單例實例的兩種方法有什麼區別?

 IConfiguration globalConfig = new Configuration(); 
     container.RegisterInstance<IConfiguration>(globalConfig); 

     container.RegisterType<IConfiguration, Configuration>(new ContainerControlledLifetimeManager()); 

是否有這兩種方式有什麼區別?什麼是註冊單例實例的首選方法?

回答

2

第一種方式註冊一個實例。當你這樣做時,你必須創建對象的實例。

第二種方式不是單身。這是一個「通過容器或其任何子容器進行任何解決方案的單身人士」。第一次將要解決的問題將「修復對象的狀態」並在LifetimeManager內註冊任何進一步的解決方案。

例如,假設你有下面的類:

class AA 
{ 
    public Datetime When { get; set; } 
    public AA() 
    { 
     this.When = Datetime.Now; 
    } 
} 

在第一種情況下,When將是登記前,在第二種情況下這將是隻要你真正解決該類型/接口。

+0

這是一個很好的例子來解釋2個選項之間的區別 – Tony98

0

在第一種情況下,您註冊了類型的實例。 所以,這個實例的字段和屬性都被修改了,直到你註冊了他,因爲這個,你可以註冊一些單身的「狀態」。 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"); 

我希望它對你有所幫助。

相關問題