2012-09-04 3 views
0

Я пытаюсь создать эффективный интерфейс, который я использую для некоторых плагинов. Я думал, что нашел достойный интерфейс, но попытка его реализовать не будет хорошо. Поэтому я надеялся увидеть, есть ли у кого-нибудь предложения по поводу того, как это можно сделать. Она ошибка вне с «не содержит публичное определение„GetEnumerator“»Дизайн интерфейса и эффективность сравнения двух списков <string>

Plugin интерфейс:

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

Ahh извините, что добавлено в [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. Также я хочу, чтобы только один метод вызывал плагин, такой как: открытый интерфейс IQueryPluginRBool: IQueryPlugin { bool Результат (ввод строки, bool sensitive); } Было бы здорово, если бы не было необходимости знать тип при выполнении этого метода. Есть идеи? – lordzero

Смежные вопросы