所以目前的情况是我有一个完全利用 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()))
但这行不通。因此,我们将不胜感激有关进行这些更改的任何帮助。如果您对我的代码有其他建议,请告诉我。我这样做是出于一种爱好,所以我知道我的代码肯定不适合大多数人。