6

我已經寫了一個類,它有一些依賴關係它從統一容器解決。統一註冊實例和解析

從我的主類創建一個新的對象

MyObject myObject = new MyObject(); 

我和團結集裝箱

UContainer.RegisterInstance<MyObject>(myObject, new ExternallyControlledLifetimeManager()); 

註冊它的創建需要這個作爲一個依賴

ConsumerObject consumer = new ConsumerObject(); 
類型

消費者看起來是這樣的:

public class ConsumerObject 
{ 
    public ConsumberObject() 
    { 
     theObject = (MyObject)UContainer.Resolve(typeof(MyObject));  
    } 
} 

,這將引發一個例外:

依賴解析失敗,TYPE = 「MyObject來」,名字= 「」。異常消息是:當前的構建操作(構建鍵構建鍵[MyObject,null])失敗:嘗試調用構造器MyObject(IPreferenceStorageProvider pp)時無法解析參數pp。 (策略類型BuildPlanStrategy,索引3)

爲什麼我的解析調用嘗試調用另一個類型的contsructor?我已經創建並註冊的情況下。我也試着像:theObject = UContainer.Resolve<MyObject>();似乎沒有什麼差別..

感謝

回答

1

據我所知團結嘗試(默認)來調用具有最多參數的構造函數,並嘗試從映射中解析每個參數。 您需要爲IPreferenceStorageProvider添加映射或刪除需要此參數的構造函數。

如果你不想通過統一注入IPreferenceStorageProvider參數,也許它不應該被聲明爲構造函數參數。你可以在默認構造函數中硬編碼這個對象的實例化。

+2

的問題是「MyObject來」是不是我的目標。它有大約15建設者..我可以創建它,但我有過它的結構無法控制。爲什麼無論如何,Unity是否會嘗試新增它?我創建了一個實例並註冊它。它現在在容器中作爲一個單例,它不應該調用任何構造函數。 – 2010-02-05 13:43:39

3

我不確定你爲什麼看到你的行爲。我剛剛創建了一個複製了你的場景的測試,它工作正常。

你有沒有嘗試過這樣的事情,

public class ConsumerObject 
{ 
    public ConsumberObject(MyObject myObject) 
    { 
     theObject = myObject 
    } 
} 

,然後使用UContainer.Resolve<MyObject>()

我能想到的唯一的事情是當你訪問UContainer.RegisterInstance然後UContainer.Resolve你實際上訪問兩個不同的容器。你能告訴我們你是如何宣佈UContainer?

6

我認爲問題在於你使用的是ExternallyControlledLifetimeManager。在這種情況下,Unity容器只包含對您的實例的弱引用。當你嘗試解決時,你的實例已經被垃圾收集了。這就是爲什麼.RegisterInstance()的默認LifeTimeManager是ContainerControlledLifeTimeManager的原因。 Darrel Miller的案子很有效,因爲它還沒有GC-ed。 嘗試註冊您的實例是這樣的:

UContainer.RegisterInstance<MyObject>(myObject);