2012-09-04 44 views
0

我一直在試圖設計一個有效的接口,我用一些插件。我以爲我發現了一個體面的界面,但試圖實施它不是很好。所以我希望看看有沒有人在這裏有更好的建議,可以做到這一點。它的錯誤了與「不包含‘的GetEnumerator’一個公共定義」接口設計和效率比較兩個列表<string>

插件接口:

namespace ALeRT.PluginFramework 
{ 
    public interface IQueryPlugin 
    { 
     string PluginCategory { get; } 
     string Name { get; } 
     string Version { get; } 
     string Author { get; } 
     System.Collections.Generic.List TypesAccepted { get; } 
    } 

    interface IQueryPluginRBool : IQueryPlugin 
    { 
     bool Result(string input, bool sensitive); 
    } 

    interface IQueryPluginRString : IQueryPlugin 
    { 
     string Result(string input, bool sensitive); 
    } 
} 

從本質上說,我試圖採取的應使用類型列表中(類型可能是URL,名稱,電子郵件,IP等),並將它們與查詢插件中的值進行比較。每個查詢插件可能有多種類型,它接受。匹配時,它將執行查詢插件中的操作。

[ImportMany] 
    public IEnumerable<IQueryPlugin> QPlugins { get; set; } 

    private void QueryPlugins(List<string> val, bool sensitive) 
    { 
     foreach (string tType in val) //Cycle through a List<string> 
     { 
      foreach (var qPlugins in this.QPlugins) //Cycle through all query plugins 
      { 
       foreach (string qType in qPlugins) //Cycle though a List<string> within the IQueryPlugin interface AcceptedTypes 
       { 
        if (qType == tType) //Match the two List<strings>, one is the AcceptedTypes and the other is the one returned from ITypeQuery 
        { 
          //Do stuff here 
        } 
       } 
      } 
     } 
    } 
+0

什麼是this.QPlugins?你能否顯示方法QPlugins中引用的所有代碼? –

+0

對不起,在第二部分代碼的[ImportMany]中加入了。 – lordzero

+0

您是否閱讀過我的答案? –

回答

1

您的代碼

foreach (string qType in qPlugins) 
{ 
    if (qType = tType) 
     { 
      //Do stuff here 
     } 
} 

將無法​​工作。你必須迭代通過qPlugins.TypeAccepted

+0

你是對的,一旦我改變了這一切就位。我想測試另一個解決方案,因爲他提出了關於在界面中使用List <>的好處。 – lordzero

+0

決定這個問題的KISS(保持簡單愚蠢)的原則。再次感謝! – lordzero

1

首先。不要暴露列表(如下面的行),因爲它違反了德米特法。這意味着該插件不控制它自己的列表。任何有插件引用的人都可以修改列表。

System.Collections.Generic.List TypesAccepted { get; } 

這是更好的:

IEnumerable<TheType> TypesAccepted { get; } 

但仍然讓任何人修改列表中的元素(無插件的知識)。如果元素是不可變的,那很好。

更好的解決方案是在插件接口中創建方法。例如有一個訪問者模式方法:

public interface IPluginTypeVisitor 
{ 
    void Visit(AcceptedType type); 
} 

public interface IQueryPlugin 
{ 
    string PluginCategory { get; } 
    string Name { get; } 
    string Version { get; } 
    string Author { get; } 
    void VisitTypes(IPluginTypeVisitor visitor); 
} 

但在你的循環例子的情況下,最好的解決辦法很簡單:

public interface IQueryPlugin 
{ 
    string PluginCategory { get; } 
    string Name { get; } 
    string Version { get; } 
    string Author { get; } 
    bool IsTypeAcceptable(TheTypeType type); // get it, thetypetype? hahaha 
} 

private void QueryPlugins(List<string> val, bool sensitive) 
{ 
    foreach (string tType in val) //Cycle through a List<string> 
    { 
     foreach (var plugin in this.QPlugins) //Cycle through all query plugins 
     { 
      if (plugin.IsTypeAcceptable(tType)) 
       //process it here 
     } 
    } 
} 
+0

這實際上很有意義。當我稍後回到電腦時,我會嘗試一下,並讓您知道它是如何發生的。 – lordzero

+0

所以有一件事我不喜歡這種方法。它要求插件進行匹配。我寧願這發生在PluginFramework內部。此外,我只想要一個方法調用插件,如: public interface IQueryPluginRBool:IQueryPlugin { bool結果(字符串輸入,布爾敏感); } 如果在執行方法時不需要知道類型,那將會很棒。有任何想法嗎? – lordzero