0

私はいくつかのプラグインに使用している効率的なインターフェースを設計しようとしています。私はまともなインターフェースを見つけたと思いましたが、それを実装しようとしてもうまくいきません。だから私は、ここにいる誰かがこれをどのように行うことができるかについていくつかのより良い提案があるかどうかを見たいと思っていました。「'GetEnumerator'のパブリック定義が含まれていません」とエラーになります

プラグインインターフェース:

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
                    }
                }
            }
        }
    }
4

2 に答える 2

1

初めに。Demeter の法則に違反しているため、(下の行のような) リストを公開しないでください。つまり、プラグインはそれ自身のリストをどのように制御しないかということです。プラグインへの参照を持っている人は誰でもリストを変更できます。

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
        }
    }
}
于 2012-09-04T05:29:53.397 に答える
1

あなたのコード

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

動作しないでしょう。反復する必要がありますqPlugins.TypeAccepted

于 2012-09-04T05:10:08.043 に答える