有兩種方法可以實現這一目標:
您可以使用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上述示例中的SomeDependency
和SomeOtherDependency
的非命名實例,以便爲您節省一些工作。
汗水,這是偉大的。這是我錯過的難題。現在一切都在一起。 – 2011-03-26 15:58:14
出於興趣,哪種方法最適合你?在我工作的一個項目中,我發現實際上這兩種方法都有用處。 – 2011-03-27 00:11:54
第二個選項幫助我很多。我正在處理的應用程序從與接口匹配的動態加載的程序集中查找類。我爲該工具創建註冊,然後爲該工作人員創建註冊併爲該工作人員指定該工具。它的1對1映射。我也有其他的建築參數,我傳遞給兩個對象。我也能夠爲AOP任務實施策略注入。這對我有很大的幫助。 – 2011-03-27 06:14:23