我看到枚舉給定服務(類型)的綁定列表的方法,但我找不到方法返回已加載模塊中綁定的所有內容的列表。 我在尋找類似於Kernel::IEnumerable<IBinding> GetAllRegisteredBindings()
如何在Ninject中列出所有已註冊的IBindings?
這是存在嗎?如果不是,我可以建立一個可以做到的擴展嗎?我需要能夠得到與服務類型綁定...
我看到枚舉給定服務(類型)的綁定列表的方法,但我找不到方法返回已加載模塊中綁定的所有內容的列表。 我在尋找類似於Kernel::IEnumerable<IBinding> GetAllRegisteredBindings()
如何在Ninject中列出所有已註冊的IBindings?
這是存在嗎?如果不是,我可以建立一個可以做到的擴展嗎?我需要能夠得到與服務類型綁定...
我翻遍了代碼,並沒有看到一種方式來請求所有的綁定。如果您熟悉修改它,並使用修改後的代碼,這裏是你可以做什麼:
到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));
雖然@戴夫thieben心不是太離譜,它會出現在你不需要forkage路線可能是在內核中註冊自定義IBindingResolver
組件,然後編造一個IRequest
它將認識到,有可能通過ResolutionExtensions.GetAll()
(在一般情況下,大多數人會要求你指定一個service
(雖然它沒有Ensure.NotNull
,有的去上它假設NotNull
)黨。
但是你忘了說了,爲什麼你想要它。
因此我建議:
哦,這很酷。我沒有考慮過。 – 2010-09-24 15:12:32
Thx Dave; thx Ruben。對不起,延遲,我沒有「通知」檢查。這最初是爲了向框架提供單一入口點而提供的,即提供已綁定的IFrameworkService後代列表的FrameworkServices類;因此調用代碼可以與管理器一起檢查服務綁定是否可用......我已經走了一條不同的路,儘管我仍然希望能夠獲得所有綁定的列表。 ;-) – 2010-09-29 17:52:28
@Robert Leahey:有很多很少的調用可以做你想做的事(找到一個特定服務的bindigns)。你問它的方式表明你想要所有服務的所有綁定,這是棘手的問題。有調用來獲取綁定,並且有要求獲得IEnumerable或服務實現的數組。還有一組用於將元數據綁定到綁定的API,以幫助用戶在解析時以編程方式選擇適當的元素,無論是強制還是聲明式 – 2010-09-29 22:44:07
我能夠使用反射來做到這一點:你爲什麼想要它
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));
這對你來說真的有訣竅嗎?我嘗試了Ninject的最新發布版本,對於我自己的綁定,'x.Target'只是打印'Type'。 Ninject的內部綁定目標值是以下值之一:{'Constant','Method','Self','Type','Provider'}。我找不到'x.Target'上的任何方法來獲取實際目標的名稱('x.Target.GetType()。Name'沒有給我任何有用的東西) – Jeff 2013-04-17 00:57:16
不,我認爲我有相同的問題其實。我從來沒有找到一個很好的方式來顯示這些信息。 – 2013-04-17 20:32:19
你能解釋一下,笏,你打算怎麼辦時,我們告訴你如何:P – 2010-09-23 23:03:18