2010-09-22 67 views
5

我看到枚舉給定服務(類型)的綁定列表的方法,但我找不到方法返回已加載模塊中綁定的所有內容的列表。 我在尋找類似於Kernel::IEnumerable<IBinding> GetAllRegisteredBindings()如何在Ninject中列出所有已註冊的IBindings?

這是存在嗎?如果不是,我可以建立一個可以做到的擴展嗎?我需要能夠得到與服務類型綁定...

+0

你能解釋一下,笏,你打算怎麼辦時,我們告訴你如何:P – 2010-09-23 23:03:18

回答

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

雖然@戴夫thieben心不是太離譜,它會出現在你不需要forkage路線可能是在內核中註冊自定義IBindingResolver組件,然後編造一個IRequest它將認識到,有可能通過ResolutionExtensions.GetAll()(在一般情況下,大多數人會要求你指定一個service(雖然它沒有Ensure.NotNull,有的去上它假設NotNull)黨。

但是你忘了說了,爲什麼你想要它。

因此我建議:

  1. 說你想要什麼
  2. 要求ninject郵件列表,其中包括回答#1 - 這不再是初學者的問題!
+0

哦,這很酷。我沒有考慮過。 – 2010-09-24 15:12:32

+1

Thx Dave; thx Ruben。對不起,延遲,我沒​​有「通知」檢查。這最初是爲了向框架提供單一入口點而提供的,即提供已綁定的IFrameworkService後代列表的FrameworkServices類;因此調用代碼可以與管理器一起檢查服務綁定是否可用......我已經走了一條不同的路,儘管我仍然希望能夠獲得所有綁定的列表。 ;-) – 2010-09-29 17:52:28

+0

@Robert Leahey:有很多很少的調用可以做你想做的事(找到一個特定服務的bindigns)。你問它的方式表明你想要所有服務的所有綁定,這是棘手的問題。有調用來獲取綁定,並且有要求獲得IEnumerable或服務實現的數組。還有一組用於將元數據綁定到綁定的API,以幫助用戶在解析時以編程方式選擇適當的元素,無論是強制還是聲明式 – 2010-09-29 22:44:07

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)); 
+0

這對你來說真的有訣竅嗎?我嘗試了Ninject的最新發布版本,對於我自己的綁定,'x.Target'只是打印'Type'。 Ninject的內部綁定目標值是以下值之一:{'Constant','Method','Self','Type','Provider'}。我找不到'x.Target'上的任何方法來獲取實際目標的名稱('x.Target.GetType()。Name'沒有給我任何有用的東西) – Jeff 2013-04-17 00:57:16

+0

不,我認爲我有相同的問題其實。我從來沒有找到一個很好的方式來顯示這些信息。 – 2013-04-17 20:32:19

相關問題