簡體   English   中英

Unity - 如何將多個映射用於相同類型並注入對象

[英]Unity - how to use multiple mappings for the same type and inject into an object

我正在使用Unity 2.0,在下面的代碼中我試圖在Worker對象中注入一個特定的工具。

我想使用以下代碼。 但是當然有一個錯誤“依賴的解決方案失敗了”。 我相信我應該可以做這樣的事情,但我很難搞清楚。

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

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

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

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

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

或者,為什么不設置需要指定ITool名為WorkerA, WorkerB, WorkerC實例...

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 ,並按照與您期望Unity使用的構造函數相同的順序指定...

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

但是,Unity將在上面的示例中查找SomeDependencySomeOtherDependency的非命名實例,以便為您節省一些工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM