2015-05-15 33 views
1

我正在研究一個嚴重依賴NServiceBus的項目。不幸的是它變得有點混亂,儘管它是用C#編寫的,但它有一些混亂。例如我有Bus.Publish(A)某處,然後在其他地方是public AHandler : IHandleMessages<A>這可能很好,但由於這是一個P/S模式,通常有多個處理程序。有一些內在需要記住項目,新開發人員很難遵循代碼流程。如何確定在接口上調用哪個類的公共方法?

我對此的解決方案是創建一個控制檯應用程序,或者某種UI,它將使用反射來掃描程序集併爲我繪製我的項目地圖。到目前爲止,我已經能夠有效地拿起所有的public class _Handler : IHandleMessages<_>這是偉大的,但現在我需要確定消息來自哪裏。

特別是,我想知道是否有方法使用反射來確定在哪個類Bus.Publish(_)被調用(總線實際上是一個IBus的實例)。對於isntance如果public void Handler(A a) { Bus.Publish(B) }我想知道傳遞給Bus.Publish()(so B)的參數以及包含此處理程序的類的名稱。

+0

我不知道NServiceBus,但不能通過調用堆棧回頭看看嗎? – amcdermott

+0

使用['StackTrace'](https://msdn.microsoft.com/en-us/library/system.diagnostics.stacktrace(v = vs.110).aspx) – Zer0

+0

這似乎是合理的,只是爲了某種清晰度,反射只會提供關於項目中存在的硬類型的信息,但檢查調用堆棧是我需要做的以確定實際運行的代碼類型。 – mike

回答

2

不知道這是否會有所幫助 - 希望它會。

我有一個要求找到一段代碼調用的起源 - 一個審計監聽器,所以我們可以記錄用於應用這些變化的組件。我的代碼如下:

Assembly currentAssembly = Assembly.GetExecutingAssembly(); 

string initialAssembly = new StackTrace().GetFrames() 
             .Where(x => x.GetMethod().ReflectedType != null) 
             .Select(x => x.GetMethod().ReflectedType.Assembly).Distinct() 
             .Where(x => x.GetReferencedAssemblies().Any(y => y.FullName == currentAssembly.FullName)) 
             .Last() 
             .FullName; 
+0

這很有幫助,'StackTrace'看起來像我之後,我不知道這個對象 – mike

相關問題