4

我正在使用Unity 2.0並在下面的代碼中嘗試在Worker對象中注入特定的工具。Unity - 如何使用同一類型的多個映射並注入對象

我想使用下面的代碼。但是,當然還有一個錯誤「解決依賴失敗」。我相信我應該能夠做到這樣的事情,但我很難搞清楚。

IUnityContainer container = new UnityContainer(); 
container.RegisterType<IWorker, Worker>("Worker") 
    .RegisterType<ITool, ToolA>("ToolA") 
    .RegisterType<ITool, ToolB>("ToolB") 
    .RegisterType<ITool, ToolC>("ToolC"); 

IWorker worker = container.Resolve<Worker>("ToolA"); 

我知道這是行不通的,但我該如何解決這個問題?

BarDev

回答

8

有兩種方法可以實現這一目標:

您可以使用ParameterOverride的和兩步解決過程......

var tool = container.Resolve<ITool>("ToolB"); 
var worker = container.Resolve<IWorker>("Worker", 
    new ParameterOverride("tool", tool)); 

...假設構造函數參數Worker接收到ITool稱爲'工具'(多個ParameterOverride實例可以傳遞給Resolve)。任何其他依賴項(通過構造函數或屬性注入)IWorker的命名實例都應該被正確解析。

或者,爲什麼不建立一個名爲WorkerA, WorkerB, WorkerC情況下,需要指定ITool ...

container.RegisterType<ITool, ToolA>("ToolA"); 
container.RegisterType<ITool, ToolB>("ToolB"); 
container.RegisterType<ITool, ToolC>("ToolC"); 
container.RegisterType<IWorker, Worker>("WorkerA", 
    new InjectionConstructor(new ResolvedParameter<ITool>("ToolA"))); 
container.RegisterType<IWorker, Worker>("WorkerB", 
    new InjectionConstructor(new ResolvedParameter<ITool>("ToolB"))); 
container.RegisterType<IWorker, Worker>("WorkerC", 
    new InjectionConstructor(new ResolvedParameter<ITool>("ToolC"))); 

缺點我用後一種方法假設是,如果Worker需要額外的構造函數的參數,你需要將它們指定在InjectionConstructor爲好,以相同的順序,你期待統一使用構造指定...

container.RegisterType<IWorker, Worker>("WorkerA", 
    new InjectionConstructor(typeof(SomeDependency), new ResolvedParameter<ITool>("ToolA"), typeof(SomeOtherDependency)); 

然而,統一將查找日e上述示例中的SomeDependencySomeOtherDependency的非命名實例,以便爲您節省一些工作。

+0

汗水,這是偉大的。這是我錯過的難題。現在一切都在一起。 – 2011-03-26 15:58:14

+0

出於興趣,哪種方法最適合你?在我工作的一個項目中,我發現實際上這兩種方法都有用處。 – 2011-03-27 00:11:54

+0

第二個選項幫助我很多。我正在處理的應用程序從與接口匹配的動態加載的程序集中查找類。我爲該工具創建註冊,然後爲該工作人員創建註冊併爲該工作人員指定該工具。它的1對1映射。我也有其他的建築參數,我傳遞給兩個對象。我也能夠爲AOP任務實施策略注入。這對我有很大的幫助。 – 2011-03-27 06:14:23

相關問題