为实现相同接口的多种类型创建自定义 Ninject 提供程序
Creating a custom Ninject provider for multiple types implementing the same interface
我有一个接口,假设它是 IDrawingTool
。我有多个 类 实现此接口,比方说 PencilTool
、PenTool
、YellowMarkerTool
等。我通常在 类 中绑定多个 类 =53=],我总是通过调用 kernel.GetAll<IDrawingTool>
来访问 IDrawingTool
个实例。到目前为止一切顺利。
现在,我想创建一个新的 IDrawingTool
实现,ConfigurableBrushTool
,它可以通过多种不同的方式进行配置(比如画笔颜色、画笔粗细等)。
我希望能够有某种 "factory"/"provider" 可以让我注入多个 IDrawingTool
s(即多个 ConfigurableBrushTool
s具有不同的配置)。也就是说,我希望能够执行以下操作:
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 多个绑定对于多个 ConfigurableBrushTool
s。但是,它仅在绑定 缺失 时有效(即,如果没有其他 IDrawingTool
绑定)。一旦我添加 PenTool
和 PencilTool
绑定,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.
对于我来说,重构现有代码以注入动态创建的工厂返回数组是更好的方法。
我有一个接口,假设它是 IDrawingTool
。我有多个 类 实现此接口,比方说 PencilTool
、PenTool
、YellowMarkerTool
等。我通常在 类 中绑定多个 类 =53=],我总是通过调用 kernel.GetAll<IDrawingTool>
来访问 IDrawingTool
个实例。到目前为止一切顺利。
现在,我想创建一个新的 IDrawingTool
实现,ConfigurableBrushTool
,它可以通过多种不同的方式进行配置(比如画笔颜色、画笔粗细等)。
我希望能够有某种 "factory"/"provider" 可以让我注入多个 IDrawingTool
s(即多个 ConfigurableBrushTool
s具有不同的配置)。也就是说,我希望能够执行以下操作:
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 多个绑定对于多个 ConfigurableBrushTool
s。但是,它仅在绑定 缺失 时有效(即,如果没有其他 IDrawingTool
绑定)。一旦我添加 PenTool
和 PencilTool
绑定,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.
对于我来说,重构现有代码以注入动态创建的工厂返回数组是更好的方法。