2013-08-04 72 views
3

這可能是一個漫長的過程,但.NET的靈活性永遠不會令我驚歎,所以在這裏。裝飾.NET程序集

我正在開發一個MVC應用程序,它需要搜索來自公共基類的類類型的一組程序集。

即我有幾個組件具有所有派生自ActivityBase的活動類型。這些程序集將被放置在特定的目錄中。他們有點像插件。由於它們需要在運行時動態加載,因此它們還需要伴隨一些依賴關係(除非我能夠找到將它們分開的便捷方式,並且也可以隨時加以注意)。

I有代碼將遍歷此目錄中的所有.DLL文件,加載程序集並遍歷程序集中的所有類型以查找從ActivityBase派生的類型。

這工作正常。但是,我想避免加載並搜索沒有活動的程序集,因爲某些依賴項具有數千種類型,並且會成爲性能問題。

所以我想我的問題是,除了文件命名約定,有沒有什麼辦法來「裝飾」或用一些類型的數據標記程序集,這將表明它是一個活動程序集,可以很容易地自動化在編譯時和在運行時輕鬆讀取?

任何其他處理這個問題的建議也是受歡迎的。

+2

自定義裝配屬性如何:http://stackoverflow.com/問題/ 1936953 /自定義組件的屬性? – nemesv

+1

另一種方式(某種程度上,因爲它使用了很多屬性本身)屬性解決方案是[微軟可擴展性框架](http://msdn.microsoft.com/en-us/library/dd460648.aspx) - MEF使您能夠獲取特定類型/實現的組件。 – pasty

+0

感謝你的這個糊塗,不知道,但MEF聽起來可能會對我的整體應用程序設計有所幫助,所以我也會仔細研究一下。 – Gerald

回答

6

你可以實現你自己的組裝屬性:

[AttributeUsage(AttributeTargets.Assembly)] 
public class ActivityAssemblyAttribute : Attribute 
{ 
} 

然後裝飾必要組件,此屬性:

[assembly: ActivityAssemblyAttribute()] 

而且,在需要的時候,只需要檢查下問題集是否是裝飾與此屬性:

ActivityAssemblyAttribute attribute = null; 
object[] attributes = assembly.GetCustomAttributes(typeof(ActivityAssemblyAttribute), false); 
if (attributes.Length > 0) 
{ 
    attribute = attributes[0] as ActivityAssemblyAttribute; 
} 
+0

這看起來像它會做的伎倆,謝謝。 – Gerald