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

时间:2016-04-16 00:18:33

标签: .net dependency-injection ninject ninject-extensions

我有一个界面,让我们说它是IDrawingTool。我有多个实现此接口的类,比如说PencilToolPenToolYellowMarkerTool等等。我通常在Ninject中绑定多个这样的类,我总是访问{{1通过调用IDrawingTool实例。到目前为止一切都很好。

现在,我想创建一个新的kernel.GetAll<IDrawingTool>实现,IDrawingTool,可以用许多不同的方式配置(比如画笔颜色,画笔粗细等)。

我希望能够拥有某种“工厂”/“提供者”,这将让我注入多个ConfigurableBrushTool s(即具有不同配置的多个IDrawingTool s。也就是说,我希望能够做到以下几点:

ConfigurableBrushTool

我无法找到通过Ninject实现这一目标的方法。

我看过实现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 / IProvider,但它只允许我返回一个我提供的类型的实例,无法批量返回多个实例。

我也看了Provider<T>,它非常接近我需要的东西:如果我为IMissingBindingResolver创建了这样的解析器,我可以为多个{{1}返回多个绑定}秒。但是,它仅在绑定缺失时才有效(即,如果没有其他IDrawingTool绑定)。只要我添加ConfigurableBrushToolIDrawingTool绑定,PenTool的绑定就不再“丢失”,因此我的自定义解析器不再被调用。

有没有办法让我的情景发生?即如何将接口绑定到(1)实现接口的特定类型,以及(2)实现接口的许多实例的“工厂”/“提供者”,以便PencilTool将返回所有绑定,(1)和(2)?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

如何绑定自定义集合(绕过多次注入),如:

public interface IToolList : IReadOnlyList<IDrawingTool> {}

并让它的实现返回两者,绑定工具和从数据库“创建”的工具,如:

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