2009-09-11 113 views
-1

我想添加一些功能,以書面,如每個模塊/插件:屬性或屬性

作者,公司,日期等

,它表示它的來源以及是誰寫的。然後程序員可以在一個DLL中有多個插件。我應該如何實現對這些支持,以便我可以在主應用程序UI中訪問它們?通常1個插件是單個公共類。

我應該使用屬性還是屬性?我也應該使用接口?

我想讓這些東西被程序員填充,而不是讓它成爲可選項。

+1

如果您使用插件編寫應用程序,您可能需要查看http://www.codeplex.com/MEF – TrueWill 2009-09-11 17:21:15

+0

謝謝,不知道那個。 – 2009-09-11 17:23:11

回答

2

由於數據在技術上是關於類的元數據,而不是插件所需的實際狀態,因此我會使用屬性。屬性旨在成爲關於代碼的元數據,這正是您想要的。

就實施它們而言,如果元數據丟失,您可能會讓主機應用程序無法加載插件。這樣,插件開發人員將無法在不提供數據的情況下測試插件。但是,您應該提供充足的文檔,以便他們知道缺少的內容,或者在加載插件失敗時提供詳細的錯誤。

大多數程序集已經有一些在AssemblyInfo類中設置的基本信息(公司,版本等)。您也可以改爲使用它。

此外,爲了防止丟失的數據問題,您可以使用一個PluginAttribute,它將屬性中的所有元數據作爲參數,並要求您的主機加載該類的屬性。我最初想要爲每個要錄製的內容添加一個屬性,但是單個屬性的效果會更好。

+0

謝謝。我可以通過編程訪問AssemblyInfo的東西嗎?如果是這樣,可能正是我所需要的,但我必須考慮是否需要此插件或程序集的信息。 – 2009-09-11 17:20:55

+1

您可以在加載程序集來檢查包含的類時,可以使用反射來獲取程序集屬性。 – NerdFury 2009-09-11 17:24:14

+0

也只是看到了你的最後一段。你能否詳細解釋一下? – 2009-09-11 18:05:49

5

我會使用一個接口,我自己。 好的一點是,您可以將其添加到現有類中,而不必重寫現有代碼,只需添加接口的屬性/方法即可。

+0

謝謝。我仍然可以強制他們通過將接口添加到插件的必要接口來實現它,對吧? – 2009-09-11 17:16:43

+1

是的,這應該工作W/O任何問題 – 2009-09-11 17:19:36

0

個人而言,我會去的屬性,但會分配值的構造函數中的後備只讀屬性。

兩全其美。 :)

+0

謝謝,爲什麼你會使用屬性? – 2009-09-11 17:14:53

+1

易用性。 – leppie 2009-09-11 19:09:13

+0

謝謝,我看到:) – 2009-09-11 20:12:15

1

如果您使用屬性,這將使插件實施者注意他們是否忘記填寫其中一個字段更難。隨着一個抽象的財產,他們將被迫執行它,否則將面臨編譯錯誤:

public abstract class PluginBase 
{ 
    protected PluginBase() 
    { 
    } 

    public abstract string Author 
    { 
     get; 
    } 

    // ... 
} 

唯一的缺點是,這種信息是真正的元數據,所以你可能會說,屬性看從「語義正確的更好「的角度。

2

我會去尋找屬性,只是因爲它聽起來像你想跟蹤的項目不需要成爲應用程序的一部分,而是代碼本身的裝飾。另外,我認爲程序員添加其他垃圾到這個並不屬於真正屬於的誘惑會更小,如果它是一個屬性。

+0

是的,沒錯。他們只會在插件的關於部分顯示。 – 2009-09-11 17:17:57

2

我認爲使用接口是一種更好的方法。 因爲每個想要編寫插件的人都應該基於契約來實現它(實現一個接口或將某些屬性放在他的類成員上),所以從插件開發人員的角度來看它並不重要,但它會是更容易,更結構化(我認爲更快),以便您的程序根據接口識別和使用實現的類。

1

已經有attributs,所以爲什麼重新發明輪子?

using System.Reflection; 

[assembly: AssemblyTitle("my app")] 
[assembly: AssemblyDescription("good app")] 
[assembly: AssemblyConfiguration("")] 
[assembly: AssemblyCompany("mycorp")] 
[assembly: AssemblyProduct("my prod")] 
[assembly: AssemblyCopyright("Copyright © me 2009")] 
[assembly: AssemblyTrademark("")] 
[assembly: AssemblyCulture("")] 
[assembly: AssemblyVersion("1.0.0.0")] 

默認情況下,它們已存在於文件AssemblyInfo.cs中。

這是在組件中存儲版本信息和其他元數據的標準方式。也許還有其他屬性也是你感興趣的,你也可以爲它創建屬性。

+0

謝謝,這很好,但每個裝配只能有1個,對不對?我可能需要他們每個插件可以在一個單一的大會,我會看到如何做到這一點。 – 2009-09-11 17:22:20

+0

您可以爲該屬性創建自己的屬性,並在屬性類上使用[AttributeUsageAttribute(AttributeTargets.Class,AllowMultiple = false)]指定它適用於類,並且每個類可能不會多次使用相同的屬性。 – codymanix 2009-09-11 17:28:15

+0

謝謝。我的意思是可能有多個。所以att#1可以在插件1-5中使用,而att#2可以在插件6-7中在同一個程序集中使用。 – 2009-09-11 17:34:37