Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从具有Ninject的另一个依赖项的属性使用构造函数参数进行多次注入_C#_.net_Dependency Injection_Ninject - Fatal编程技术网

C# 从具有Ninject的另一个依赖项的属性使用构造函数参数进行多次注入

C# 从具有Ninject的另一个依赖项的属性使用构造函数参数进行多次注入,c#,.net,dependency-injection,ninject,C#,.net,Dependency Injection,Ninject,我有一个接口,其中包含实现IModule接口的实例枚举: 公共接口i配置 { IEnumerable模块{get;} } 我有一个类将IModule实现作为构造函数参数: 公共类模块客户端:IModuleClient { 公共模块客户端(IModule模块) { } } 我还有一个类将IModuleClient实现数组作为构造函数参数: 公共类模块服务:IModuleService { 公共模块服务(IModuleClient[]客户端) { } } 我需要使用Modules属性中的每个I

我有一个接口,其中包含实现IModule接口的实例枚举:

公共接口i配置
{
IEnumerable模块{get;}
}
我有一个类将IModule实现作为构造函数参数:

公共类模块客户端:IModuleClient
{
公共模块客户端(IModule模块)
{
}
}
我还有一个类将IModuleClient实现数组作为构造函数参数:

公共类模块服务:IModuleService
{
公共模块服务(IModuleClient[]客户端)
{
}
}
我需要使用Modules属性中的每个IModule实例创建一个IModuleClient实例数组,并将该数组注入ModuleService构造函数

是否有可能通过多次注入实现这一点,或者我必须创建一个IModuleClient实例工厂,并将其与IConfiguration一起注入ModuleService

我可以从上下文访问内核,例如,通过以下方式将构造函数参数绑定到另一个接口的属性:

Bind()
.至()
.WithConstructorArgument(“module”,c=>c.Kernel.Get().module);
公共接口i配置
{
IModule模块{get;}
}
公共类模块客户端:IModuleClient
{
公共模块客户端(IModule模块)
{
}
}
允许将多个实现绑定到单个接口,并获得注入的接口实现数组。我可以将几个具有不同构造函数参数的实例绑定到一个接口并将其作为数组注入吗


一种可能的解决方案是创建IModuleClient工厂,将IConfiguration注入到ModuleService,并使用工厂创建实例。我想知道有没有更简单或更好的解决方案?

我没有尝试过这两种方法,但理论上,您可以为每个
模块应用
ModuleClient
绑定:

var config = kernel.Get<IConfiguration>();
foreach(var module in config.Modules)
    kernel.Bind<IModuleClient>()
        .To<Module>()
        .WithConstructorArgument("module", module);
var config=kernel.Get();
foreach(config.Modules中的var模块)
kernel.Bind()
.至()
.带有构造函数参数(“模块”,模块);
。。。或者您也可以为数组本身创建一个绑定:

Bind<IModuleClient[]>()
   .To(c => c.Kernel.Get<IConfiguration>().Modules
       .Select(m => new ModuleClient(m))
       .ToArray());
Bind()
.To(c=>c.Kernel.Get().Modules
.选择(m=>new ModuleClient(m))
.ToArray());

我没有尝试过这两种方法,但理论上,您可以为每个
模块应用
ModuleClient
绑定:

var config = kernel.Get<IConfiguration>();
foreach(var module in config.Modules)
    kernel.Bind<IModuleClient>()
        .To<Module>()
        .WithConstructorArgument("module", module);
var config=kernel.Get();
foreach(config.Modules中的var模块)
kernel.Bind()
.至()
.带有构造函数参数(“模块”,模块);
。。。或者您也可以为数组本身创建一个绑定:

Bind<IModuleClient[]>()
   .To(c => c.Kernel.Get<IConfiguration>().Modules
       .Select(m => new ModuleClient(m))
       .ToArray());
Bind()
.To(c=>c.Kernel.Get().Modules
.选择(m=>new ModuleClient(m))
.ToArray());

1)谁创建了Foo实例?(不要说容器..我的意思是谁将IFoo注入到容器中)或谁解析IFoo实例。2) Foo应该是一个单例还是一个范围如何局限于Baz实例的实例?如果您想要任何有用的答案,您可能需要更新您的问题,并提供更多关于您正在做什么以及为什么这样做的上下文。请使用真实的类和接口名称,可能描述类打算包含什么或做什么,并描述您实际需要或想要这个的原因。这允许其他人对设计提供反馈,并建议替代设计,使您的问题更容易解决,甚至可能完全消失。@eranotzap Foo实际上是使用工厂创建的,它解析配置文件并创建包含配置值的接口代理。配置被注入到配置服务中,配置服务提供了一个验证和保存配置的接口。IFoo在singleton范围内。@Steven谢谢你的建议。我想让问题保持简单,但我想提供更多信息是有意义的。我将更新这个问题。1)谁创建了Foo实例?(不要说容器..我的意思是谁将IFoo注入到容器中)或谁解析IFoo实例。2) Foo应该是一个单例还是一个范围如何局限于Baz实例的实例?如果您想要任何有用的答案,您可能需要更新您的问题,并提供更多关于您正在做什么以及为什么这样做的上下文。请使用真实的类和接口名称,可能描述类打算包含什么或做什么,并描述您实际需要或想要这个的原因。这允许其他人对设计提供反馈,并建议替代设计,使您的问题更容易解决,甚至可能完全消失。@eranotzap Foo实际上是使用工厂创建的,它解析配置文件并创建包含配置值的接口代理。配置被注入到配置服务中,配置服务提供了一个验证和保存配置的接口。IFoo在singleton范围内。@Steven谢谢你的建议。我想让问题保持简单,但我想提供更多信息是有意义的。我将更新这个问题。AFAIK数组绑定(以及
IList
IEnumerable
)将不起作用,因为ninject的“多重注入”功能基本上会在检查绑定之前接管解析。@BatteryBackupUnit:感谢您的反馈。我从来没有使用过多重注入,所以我不确定它是如何工作的。AFAIK数组绑定(以及
IList
IEnumerable
)将无法工作,因为ninject的“多重注入”功能基本上会在检查绑定之前接管解析。@BatteryBackupUnit:感谢您的反馈。我从来没有使用过多次注射,所以我不确定那会怎样。