我看到了枚举给定服务(类型)的绑定列表的方法,但是我找不到一个方法返回已加载模块中绑定的所有内容的列表。
我正在寻找像Kernel::IEnumerable<IBinding> GetAllRegisteredBindings()
这是否存在?如果没有,我可以建立一个可以做到的扩展吗?我需要能够使用服务类型来获取绑定...
答案 0 :(得分:2)
我查看了代码并没有看到请求所有绑定的方法。如果您对修改它并使用修改后的代码感到满意,那么您可以执行以下操作:
到IKernel.cs,添加:
/// <summary>
/// Gets all registered bindings
/// </summary>
IEnumerable<IBinding> GetBindings();
到KernelBase.cs,添加:
/// <summary>
/// Gets all registered bindings
/// </summary>
public virtual IEnumerable<IBinding> GetBindings()
{
return _bindings.SelectMany( kvp => kvp.Value );
}
并重新编译。
使用:
var bindings = Kernel.GetBindings();
bindings.ForEach( b => logger.DebugFormat( "Binding: {0} -> {1}", b.Service, b.Target ) );
答案 1 :(得分:2)
虽然@dave thieben并没有错,但看起来您的路由不需要分叉可能是在内核中注册自定义IBindingResolver
组件,然后编制它将识别的IRequest
组件,可能通过ResolutionExtensions.GetAll()
(一般情况下,大多数都会要求您指定一个service
(虽然没有Ensure.NotNull
,但有些人会假定为NotNull
)。
但是你忘了说你为什么要这样做。
因此我建议:
答案 2 :(得分:1)
我能够使用反射来做到这一点:
KernelBase baseKernel = (KernelBase)Kernel;
// _commandCollection is an instance, private member
BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic;
// Retrieve a FieldInfo instance corresponding to the field
FieldInfo field = typeof(KernelBase).GetField("bindings", flags);
Multimap<Type, IBinding> bindingsMap = (Multimap<Type, IBinding>)field.GetValue(baseKernel);
bindingsMap.SelectMany(x => x.Value).ToList().ForEach(x => log.DebugFormat("Binding: {0} -> {1}", x.Service, x.Target));