所以目前的情况是我有一个完全利用MEF的程序。现在,我想让它利用Rx来扩展到更大的查询,并允许用户在各种插件返回结果时查看结果。目前设置如下:
工作流:查询=>确定类型=>查询插件=>结果
目前,如果有人需要引用比我下面发布的内容更多的内容,这些代码都存储在GitHub上。GitHub 上的ALeRT
VS解决方案有一个UI项目(默认启动项目)、一个PluginFramework项目、各种TypePlugin项目(考虑确定类型,如URL、电子邮件、文件、电话号码等)以及QueryPlugin项目。(如果QueryPlugin支持已确定的类型,则执行xyz)。所有结果都通过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()))
但这行不通。因此,我们将非常感谢对做出这些改变的任何帮助。如果你对我的代码有其他建议,请告诉我。我这样做是一种爱好,所以我知道我的代码对大多数人来说肯定不符合标准。
这对你有用吗:
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;