2011-12-20 29 views
2

我正在閱讀文檔,並看到如果您不使用接口,則Windsor只能截取虛擬方法?Windsor爲什麼只能截取虛擬或接口方法?

這是Windsor的限制還是簡單的C#語言?我正在尋找一個深入的答案。

+0

我對這項技術也很陌生。剛剛陷入這個錯誤,並沒有使虛擬方法成爲現實。 – 2012-04-24 14:41:47

回答

4

C#語言在這裏完全不相關。問題是攔截在運行時級別如何工作。

一種技術是繼承類/實現接口並將其用作代理。這顯然只能覆蓋虛擬方法和接口方法。我懷疑Windsor使用這種技術。這種技術的優點是它不需要任何特殊的東西。只需在運行時創建一個類。

另一種方法是使用分析API。這允許您修改任何方法的IL,包括非虛擬方法。這更具侵入性,通常只在測試遺留代碼時才使用。

另一種方法是在構建時使用IL重寫。這可以在您編寫的代碼中添加攔截點,但不會在框架代碼中添加攔截點。

+0

你是對的,溫莎Intercepor是動態代理:http://kozmic.pl/dynamic-proxy-tutorial/ – Crixo 2011-12-29 14:36:29

+0

Acutally -1。對於設計良好的代碼,IL過度使用也是標準的......當我設計一個API(壞的實踐)時,我不能讓我的類打開子類化,只是因爲一個嘲諷工具太愚蠢而無法處理好密封的類。 – TomTom 2012-01-09 07:04:08

+0

不知道爲什麼你的答案仍未標記。 – 2012-04-24 14:43:45

2

既沒有也沒有。 Windsor通過子類工作,並且只能合理地覆蓋虛擬方法 - 或者可以實現接口。

其他任何事情都需要調試器/探查器掛鉤處於活動狀態,這很難做 - 有些嘲諷框架支持,儘管它們都不是免費的。

+0

我認爲微軟鼴鼠是免費的,可以做到這一點。但我自己並沒有嘗試過。 – CodesInChaos 2012-04-24 14:51:34

+0

痣已退休。它現在被稱爲「Fakes」,是Visual Studio 11的一部分;)http://research.microsoft.com/en-us/projects/moles/ – TomTom 2012-04-25 17:36:52

2

這是.NET框架的限制。 Windsor產生一個動態實現,它實現一個接口或覆蓋一個虛擬成員。 .NET不允許重寫未虛擬的成員。

+0

-1。這是嘲笑方面劣勢技術的限制。相當一些商業框架做對了。 – TomTom 2012-01-09 07:04:32

+0

@TomTom你可以命名這樣做的框架,我想檢查它們,謝謝 – 2012-01-09 09:05:59

+0

Telerik JustMock有兩種模式 - 一種通過代理,一種通過IL替換。它也不是很昂貴。還有一臺,但每臺機器2500美元 - 包括構建服務器。 – TomTom 2012-01-09 09:16:04

-2

是的,你需要虛擬的,但這只是因爲微軟已經搞砸了這種行爲,如果你看Java的方法默認情況下打開擴展,你必須明確標記爲密封。

閱讀更多關於SOLID原則,特別是Open Closed Principle。

+0

-1。那麼如何在Java中對selaed方法進行子類化?停止宗教戰爭 - 在測試模擬密封方法和良好框架支持這一點時,有很好的理由。 – TomTom 2012-01-09 07:05:12

+0

TomTom並不是一件宗教性的事情,如果它支持代碼編織,所有的代碼都會很棒,我只是表示,如果你不想,可以在你的代碼中遵循開放的封閉原則,這是一個很好的習慣。我的客人:) – Nexus 2012-01-09 09:53:14

+0

當然。只是爲了方便單元測試而違反項目要求(封閉的API),這是嚴格嘲諷框架的限制。好的甚至可以用另一個類替換一個類中的NEW構造。 – TomTom 2012-01-09 11:44:54

相關問題