[英]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將在上面的示例中查找SomeDependency
和SomeOtherDependency
的非命名實例,以便為您節省一些工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.