[英]Castle Windsor inject dependency depending on another parameter in the constructor
[英]Multi inject with constructor parameter from a property of another dependency with Ninject
我有一個接口,其中包含實現IModule接口的實例的枚舉:
public interface IConfiguration
{
IEnumerable<IModule> Modules { get; }
}
我有一個將IModule實現作為構造函數參數的類:
public class ModuleClient : IModuleClient
{
public ModuleClient(IModule module)
{
}
}
我還有一個類,將IModuleClient實現的數組作為構造函數參數:
public class ModuleService : IModuleService
{
public ModuleService(IModuleClient[] clients)
{
}
}
我需要使用Modules屬性中的每個IModule實例創建一個IModuleClient實例數組,並將該數組注入ModuleService構造函數中。
是否可以通過多次注入來實現此目的,還是必須創建IModuleClient實例的工廠並將其與IConfiguration一起注入ModuleService中?
我可以從上下文訪問內核,例如通過以下方式將構造函數參數綁定到另一個接口的屬性:
Bind<IModuleClient>()
.To<ModuleClient>()
.WithConstructorArgument("module", c => c.Kernel.Get<IConfiguration>().Module);
public interface IConfiguration
{
IModule Module { get; }
}
public class ModuleClient : IModuleClient
{
public ModuleClient(IModule module)
{
}
}
多重注入允許將多個實現綁定到單個接口,並獲取注入的一系列接口實現。 我可以將具有不同構造函數參數的多個實例綁定到接口並將其作為數組注入嗎?
一種可能的解決方案是創建IModuleClient工廠,將其與IConfiguration一起注入ModuleService並使用該工廠創建實例。 我想知道有沒有更簡單或更完善的解決方案?
我沒有嘗試過這兩種方法,但是從理論上講,您可以為每個Modules
應用ModuleClient
綁定:
var config = kernel.Get<IConfiguration>();
foreach(var module in config.Modules)
kernel.Bind<IModuleClient>()
.To<Module>()
.WithConstructorArgument("module", module);
...或者您可能只為數組本身創建了一個綁定:
Bind<IModuleClient[]>()
.To(c => c.Kernel.Get<IConfiguration>().Modules
.Select(m => new ModuleClient(m))
.ToArray());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.