如何在Ninject中列出所有已注册的IBindings?

时间:2010-09-22 19:46:28

标签: ninject

我看到了枚举给定服务(类型)的绑定列表的方法,但是我找不到一个方法返回已加载模块中绑定的所有内容的列表。 我正在寻找像Kernel::IEnumerable<IBinding> GetAllRegisteredBindings()

这样的东西

这是否存在?如果没有,我可以建立一个可以做到的扩展吗?我需要能够使用服务类型来获取绑定...

3 个答案:

答案 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)。

但是你忘了说你为什么要这样做。

因此我建议:

  1. 说出你想要的东西
  2. 询问ninject邮件列表,包括#1的答案 - 这不是初学者的问题!

答案 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));
相关问题