2009-06-01 73 views
3

我的工作,在啓動時從一個子目錄加載插件的應用程序,目前我使用反射來遍歷每個類型的組裝,並找到實現IPluginModule公開課這樣做接口。反思與屬性的插件架構

由於反射涉及性能問題,我期望在一段時間後會有幾個插件,我想知道是否可以在程序集級別定義應用的自定義屬性,在遍歷類型(可能在程序集中有十二種類型,包括IPluginModule的實現者)。

屬性,如果存在的話,然後可以提供以返回所需要的類型或實例的方法,然後再遍歷類型就只能是回退機制。將類型信息存儲在配置文件中不是一個選項。

這會提高性能,或者它只是沒有比時間問題,實際上需要從存儲加載該程序集?此外,這種用法是否適用於屬性?

+0

表現擊中?我希望來自Java,但不是來自C# - 我很想知道你是否以及如何衡量這一點。 – 2009-06-01 13:17:35

回答

7

我會用一個問題回答你的問題:你爲什麼擔心這個問題?

你在一次操作擔心一個潛在性能下降,因爲有可能在以後幾個插件。

除非你的應用程序的啓動時間過長給用戶,我不會浪費時間考慮這個問題 - 有可能是更好的東西,你可以工作,以提高應用程序。

+0

我首先嚐試了配置建議,但後來我發現它幾乎沒有區別,因爲我不得不使用Activator/Assembly.CreateInstance。 現在我正在使用自定義的程序集級屬性來獲取類型名稱,並且正如您猜測的那樣,我已經發現了其他可以提高啓動時間的區域。 – Botz3000 2009-06-01 18:37:59

0

我曾想過,要求程序集中所有使用屬性標記的類都使用反射。然後它會下降到元數據,接口實現或屬性標記中更快的查找?

+0

我想我在某處閱讀元數據的速度更快。但我確實只是在談論毫秒。 – IAbstract 2010-01-26 04:46:40

7

你也可以在配置中的可插拔類型的,所以你知道確切的階級,而不是通過所有類別循環。必須爲此選項提供一些配置實用程序......但可能會取決於您正在循環的類的數量而提高性能。

+0

+1 - 這正是我如何做到的。在配置中註冊帶有應用程序的插件。然後,我使用自定義節處理程序來實際加載插件。 – tvanfosson 2009-06-01 13:31:46

+0

我也是,只有在第一次添加時纔會遍歷程序集。我提取我以後需要的細節(加上一些用戶友好的信息)。這些數據被序列化以備後用(通過Activator)。用戶在啓動時也可以選擇「自動實例化」插件。 – IAbstract 2010-01-26 04:44:11

3

相信無論是微軟的兩大.NET插件框架,託管外接程序框架(MAF)和託管擴展框架(MEF)可以使用屬性或反射發現插件。所以微軟似乎覺得屬性是合適的。

雖然我不確定性能差異。

1

一個好的解決方案是緩存所有關於插件的信息。應用程序第一次啓動時,會對插件dll進行全面掃描,並保存在文件中找到的類型列表。下次應用程序啓動時,它會從文件加載信息,這比再次掃描所有dll要快得多。應用程序還可以存儲每個dll的時間戳,因此如果它檢測到dll中的更改,它可以重新掃描並更新緩存。

這基本上是Mono.Addins framework之後的方法。