为实现相同接口的多种类型创建自定义 Ninject 提供程序

Creating a custom Ninject provider for multiple types implementing the same interface

我有一个接口,假设它是 IDrawingTool。我有多个 类 实现此接口,比方说 PencilToolPenToolYellowMarkerTool 等。我通常在 类 中绑定多个 类 =53=],我总是通过调用 kernel.GetAll<IDrawingTool> 来访问 IDrawingTool 个实例。到目前为止一切顺利。

现在,我想创建一个新的 IDrawingTool 实现,ConfigurableBrushTool,它可以通过多种不同的方式进行配置(比如画笔颜色、画笔粗细等)。

我希望能够有某种 "factory"/"provider" 可以让我注入多个 IDrawingTools(即多个 ConfigurableBrushTools具有不同的配置)。也就是说,我希望能够执行以下操作:

kernel.Bind<IDrawingTool>.To<PencilTool>();
kernel.Bind<IDrawingTool>.To<PenTool>();
kernel.Bind<IDrawingTool>.ToTypeProvider<ConfigurableBrushToolProvider>();
//...where ConfigurableBrushToolProvider reads e.g. 50 different
//brush configurations (color, thickness, etc) from the database/file/network/whatever
//and binds 50 different ConfigurableBrushTool instances.
//Of course, .ToTypeProvider() doesn't really exist :)

//Later on:
var tools = kernel.GetAll<IDrawingTool>(); //Should return pencil, pen and all 50 brushes

我还没有找到一种方法来实现 Ninject。

我考虑过实现 IProvider / Provider<T>,但它只允许我 return 我提供的类型的一个实例,没有办法 return 批量多个实例。

我也看过 IMissingBindingResolver,它非常接近我需要的:如果我为 IDrawingTool 创建这样一个解析器,我可以 return 多个绑定对于多个 ConfigurableBrushTools。但是,它仅在绑定 缺失 时有效(即,如果没有其他 IDrawingTool 绑定)。一旦我添加 PenToolPencilTool 绑定,IDrawingTool 的绑定就不再是 "missing",因此不再调用我的自定义解析器。

有没有办法让我的情景发生? IE。我如何将接口绑定到 (1) 实现接口的特定类型,以及 (2) 实现接口的许多实例的 "factory"/"provider",这样 GetAll 将 return 所有绑定,包括 (1) 和 (2)?

绑定自定义集合(规避多重注入)如何:

public interface IToolList : IReadOnlyList<IDrawingTool> {}

并实现 return 绑定工具和来自数据库的工具 "created",例如:

public class ToolList : List<IDrawingTool>, IToolList
{
    public ToolList(IDrawingTool[] boundTools,... otherDependencies)
    {
       ... create all tools here
    }
}

首先,看起来没有 OOTB 功能可以从模块中的一个绑定集进行多个绑定(至少我没有找到任何明显的)。
其次,我设法使用自定义内核创建了一些 PoC,允许您通过一个 .Bind.To 调用创建一对多绑定。 Is 基于覆盖 IKernel.GetBindings(..) 方法并查找所有具有特殊参数的绑定。然后我们可以删除它们,替换为自定义生成的数量。
然而,我认为如果不仔细优化这种逻辑将对性能产生巨大影响(无论如何 PoC 都没有这样做)并且只有在真正需要时才应该将其投入生产。这个PoC你可以找到here.
对于我来说,重构现有代码以注入动态创建的工厂返回数组是更好的方法。