使用Ninject

时间:2015-10-06 12:39:50

标签: c# .net dependency-injection 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)
    {
    }
}

Multi injection允许将多个实现绑定到单个接口,并获取注入的接口实现数组。我可以将具有不同构造函数参数的多个实例绑定到接口并将其作为数组注入吗?

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

1 个答案:

答案 0 :(得分:0)

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

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());