0

所以目前的情况是我有一个完全利用 MEF 的程序。现在我想让它利用 Rx 来允许它扩展到更大的查询,并允许用户在各种插件返回结果时查看结果。当前设置如下:

工作流程:查询 => 确定类型 => 查询插件 => 结果

目前,如果有人需要引用比我在下面发布的更多内容,代码都存储在 GitHub 上。 GitHub 上的警报

VS 解决方案有一个 UI 项目(默认启动项目)、一个 PluginFramework 项目、各种 TypePlugin 项目(考虑确定类型是什么,例如 URL、电子邮件、文件、电话号码等)以及 QueryPlugin 项目(如果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 回答