2015-11-02 73 views
2

我正在尋找任何能夠識別這是否可能的人,我目前正在編寫一個小型但可擴展的應用程序,該應用程序將具有插件體系結構。將實現的接口指定爲C#中的一個屬性

以確保應用程序是可適用於當前的應用程序,我使用的是自定義屬性附加到組裝

[AttributeUsage(AttributeTargets.Assembly)] 
    class PluginAttributes: Attribute 
    { 
     public PluginAttributes(string name, string description, string version, string author) 
     { 
      Name = name; 
      Description = description; 
      Version = version; 
      Author = author; 
     } 

     public string Name { get; private set; } 
     public string Description { get; private set; } 
     public string Version { get; private set; } 
     public string Author { get; private set; } 
     public XXXXXX Implements { get; private set; } 
    } 

我瞄準的是什麼,就是「使」屬性將確定適當的插件的接口類型。我有許多在庫中定義的接口,如ICompress,IEncrypt,ILogging等。

該屬性將用於分類它是哪種類型的插件,而不必爲每個插件創建單獨的屬性。

我知道我可以讓它作爲字符串傳遞並使用反射或使用枚舉,但我希望代碼儘可能低維護,以便可以在不觸及應用程序核心的情況下開發插件。

+0

那麼一個插件不能實現多個接口?我看起來不太靈活。 – xxbbcc

+1

XXXXXX可以是'Type'類型。我分享@xxbbcc的意見,認爲將這個屬性應用於整個Assembly是不太靈活的。爲什麼不創建可應用於類的屬性?然後您可以請求所有實現您屬性的類來獲取程序集中的所有插件。 –

+0

是的,這在設計上非常有用,因爲其意圖是可以將工作流與不同的插件混合匹配,並且每個接口都針對某種類型的插件,因此每個模塊只應該對實現一個流程感興趣 –

回答

0

我已經做了各種這種類型的插件機制,並且通常更容易創建插件類的實例並檢查各種接口,而不是在屬性上定義它。這將爲一個插件開放一個插件來實現多個界面,這很好。

你可以這樣做,像這樣使用反射(假設你知道類型名):

object plugin = Activator.CreateInstance("Assembly.Name", "Type.Class.Name"); 

if (plugin is ILogging) 
{ ... } 

if (plugin is IEncrypt) 
{ ... } 

對於當前的代碼,我建議你讓你的Implements財產Type的類型,它使用typeof(ILogging)填寫,typeof(IEncrypt)

+0

我認爲關於使用'Type',但找不到任何特別限制爲Interface類型的方式,而不是任何舊類型,理想情況下類似於泛型'T:interface'會很棒:) –

+1

是的,用你目前的設計可能。這就是爲什麼我建議放棄這一點。 :) –