0

現状では、MEF を完全に利用しているプログラムがあります。ここで、より大きなクエリにスケーリングできるように Rx を利用し、さまざまなプラグインが結果を返すときにユーザーが結果を確認できるようにしたいと考えています。現在、次のようにセットアップされています。

ワークフロー:クエリ => タイプの決定 => クエリプラグイン => 結果

現在、コードはすべてGitHubに保存されており、以下に投稿したもの以外を参照する必要がある場合に備えて. GitHub のアラート

VS ソリューションには、UI プロジェクト (デフォルトのスタートアップ プロジェクト)、PluginFramework プロジェクト、さまざまな TypePlugin プロジェクト (URL、電子メール、ファイル、電話番号などの種類を決定することを考えてください)、および QueryPlugin プロジェクト (必要な場合は xyz を実行します) があります。 queryplugin は判別済みの型をサポートしています)。すべての結果は、DataTable の DefaultView によってマップされている DataGrid によって UI に表示されます。

Rx 部分をプラグインからできるだけ見えないようにしたいと考えています。これは、プラグインの作成を複雑にする少数の人々のために複雑にしたくないという事実によるものです。だから私は以下の現在のフレームワークを取ることを考えていました:

public interface IQueryPlugin
{
    string PluginCategory { get; }
    string Name { get; }
    string Version { get; }
    string Author { get; }
    System.Collections.Generic.List<string> TypesAccepted { get; }
    string Result(string input, string type, bool sensitive);
}

Result メソッドを次のようにします。

System.IObservable<string> Result(string input, string type, bool sensitive);

これには当然、プラグインを呼び出しているメソッドを変更する必要があります。

                using (GenericParserAdapter parser = new GenericParserAdapter())
                {
                    using (TextReader sr = new StringReader(qPlugins.Result(query, qType, sensitive)))
                    {
                        Random rNum = new Random();

                        parser.SetDataSource(sr);
                        parser.ColumnDelimiter = Convert.ToChar(",");
                        parser.FirstRowHasHeader = true;
                        parser.MaxBufferSize = 4096;
                        parser.MaxRows = 500;
                        parser.TextQualifier = '\"';

                        DataTable tempTable = parser.GetDataTable();
                        tempTable.TableName = qPlugins.Name.ToString();
                        if (!tempTable.Columns.Contains("Query"))
                        {
                            DataColumn tColumn = new DataColumn("Query");
                            tempTable.Columns.Add(tColumn);
                            tColumn.SetOrdinal(0);
                        }

                        foreach (DataRow dr in tempTable.Rows)
                        {
                            dr["Query"] = query;
                        }

                        if (!resultDS.Tables.Contains(qPlugins.Name.ToString()))
                        {
                            resultDS.Tables.Add(tempTable);
                        }
                        else
                        {
                            resultDS.Tables[qPlugins.Name.ToString()].Merge(tempTable);
                        }
                        pluginsLB.DataContext = resultDS.Tables.Cast<DataTable>().Select(t => t.TableName).ToList();
                    }
                }

そのため、この時点で、これを機能させる方法に行き詰まっています。MEF を Rx と統合する方法に関する適切なドキュメントはないようです。私の仮定は、次の変更を加えることです

using (TextReader sr = new StringReader(qPlugins.Result(query, qType, sensitive).Subscribe()))

しかし、これはうまくいきません。したがって、これらの変更を行う際の助けをいただければ幸いです。私のコードに関して他に提案がある場合は、お知らせください。私はこれを趣味として行っているので、私のコードがほとんどの人にとって十分なものではないことはわかっています。

4

1 に答える 1

1

これはあなたのために働くでしょうか:

IObservable<DataTable> q =
    from text in qPlugins.Result(query, qType, sensitive)
    from tempTable in Observable.Using(
        () => new GenericParserAdapter(),
        parser => Observable.Using(
            () => new StringReader(text),
            sr => Observable .Start<DataTable>(
                () =>
                {
                    var rNum = new Random();

                    parser.SetDataSource(sr);
                    parser.ColumnDelimiter = Convert.ToChar(",");
                    parser.FirstRowHasHeader = true;
                    parser.MaxBufferSize = 4096;
                    parser.MaxRows = 500;
                    parser.TextQualifier = '\"';

                    var tempTable = parser.GetDataTable();
                    tempTable.TableName = qPlugins.Name.ToString();
                    if (!tempTable.Columns.Contains("Query"))
                    {
                        DataColumn tColumn = new DataColumn("Query");
                        tempTable.Columns.Add(tColumn);
                        tColumn.SetOrdinal(0);
                    }

                    foreach (DataRow dr in tempTable.Rows)
                        dr["Query"] = query;

                    return tempTable;
                })))
    select tempTable;
于 2012-10-11T06:00:27.337 に答える