我有一个界面,让我们说它是IDrawingTool
。我有多个实现此接口的类,比如说PencilTool
,PenTool
,YellowMarkerTool
等等。我通常在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
绑定)。只要我添加ConfigurableBrushTool
和IDrawingTool
绑定,PenTool
的绑定就不再“丢失”,因此我的自定义解析器不再被调用。
有没有办法让我的情景发生?即如何将接口绑定到(1)实现接口的特定类型,以及(2)实现接口的许多实例的“工厂”/“提供者”,以便PencilTool
将返回所有绑定,(1)和(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
}
}