2013-03-11 17 views
8

我正在爲我的應用程序創建一個插件系統,我希望插件公開一個人類可讀的名字。應用程序將顯示可用插件的列表,在此列表中名稱需要可用。給插件類一個人類可讀的名字

我想讓插件的開發人員清楚他們需要做什麼來使他們的插件工作。

目前我正在使插件類實現一個接口,並且該接口需要實現一個屬性「ConsumerName」。但是,這需要主應用程序創建每個插件的實例,才能使用CunsumerName屬性,以顯示列表。

public interface IDataConsumer : IDisposable 
{ 
    string ConsumerName { get; } 

    void Consume(DataRowSet rows); 

    ... 
} 

有沒有什麼辦法強制插件類提供元數據而不創建每種類型的實例?

我的回退計劃是在每個類上使用反射和某些屬性,但我不認爲可以強制使用接口的屬性。

+0

您應該從配置文件中讀取該插件的名稱,該配置文件將與該插件一起提供。 – Guillaume 2013-03-11 12:39:14

回答

4

不,屬性不能成爲界面合同的一部分。但是他們可以被強烈推薦。

我在過去所做的那樣由一個屬性,如:

[AttributeUsage(AttributeTargets.Class)] 
public class PluginNameAttribute : Attribute { 
    public string ConsumerName { get; set; } 
} 

如果程序員選擇裝修自己的類與屬性,那也不錯。如果沒有,你可以依傍類名稱本身:

var consumerName = type.Name; 
var nameAttribute = type.GetCustomAttributes(typeof(PluginNameAttribute), true) 
    .FirstOrDefault() as PluginNameAttribute; 
if (nameAttribute != null) { 
    var attributeName = nameAttribute.ConsumerName; 
    if (!string.IsNullOrEmpty(attributeName)) { 
     consumerName = attributeName; 
    } 
} 

它不應該是過分的要求插件開發人員使用屬性,如果它的記錄,他們應該這樣做的。

+0

不錯,簡單。通過插件開發人員可以發現屬性類本身的好方法是什麼? – 2013-03-11 12:45:23

+0

@PeterHenell - 正如Jon所說,如果插件類沒有使用該屬性進行修飾,則拋出異常總是可能的。這樣,開發人員第一次測試他的插件時,他會立即知道它是必需的。如果這聽起來太極端了,那麼好的文檔可能就是答案。 – ken 2013-03-11 12:50:37

+0

拋出異常可能是我最終要做的事情,或者在應用程序中顯示某種類型的調試窗口,以顯示此類信息。 – 2013-03-11 13:26:17

3

通常我會說「不,沒有」。這是因爲有兩種機制可以在不需要創建實例的情況下將信息從類型中提取出來:static成員和屬性。由於這些機制和接口之間沒有重疊,因此您無法同時滿足您所有的要求。

但是,基於屬性的解決方案有什麼問題?當然,你不能強制出現編譯失敗的屬性,但你可以在加載插件時(或者更早)執行該操作。