【发布时间】:2013-02-12 11:59:09
【问题描述】:
我对MEF有点困惑,我以为我已经开始理解它了,但似乎我并不完全在那里。
所以,我有一个我想读入的 XML 测试步骤列表。这个想法是主应用程序在运行时对这些类型一无所知。
<TestSteps>
<TestRunner xsi:type="SimulateDc" Measurement="54"/>
<TestRunner xsi:type="MeasureDc" Output="1"/>
</TestSteps>
所以我有一个带有静态“结果”类的基类型,它允许我保存信息以在步骤之间传递(上面 XML 中的 Output 属性)。这里的测试处理程序由 MEF 导出,我在运行时将它们读入,然后将 Type 传递给 XML 序列化程序以创建处理程序列表。这一切都有效,我得到了一个测试运行者的列表。我在这里为每种类型都有一个DataTemplate 导出,所以当我使用内容控件时,它知道如何绘制自己。一切似乎都很好,但我认为我的思维过程出错了。
一个问题是我现在想将导入的处理程序绑定到某些硬件。硬件处理例程旨在由更多 MEF 导入处理
所以有了这样的界面:
public interface IMeasureHW
{
double Measure();
}
然后使用这个:
[Export("MeasureDc", typeof(IMeasureHW))]
public class MeasureDcHW : IMeasureHW
{
public double Measure()
{
return 54.0;
}
}
然后在我的一个测试处理程序中我做了这个:
[Import("MeasureDc", typeof(IMeasureHW))]
IMeasureHW hardware { get; set; }
我的导入是这样进行的:
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new DirectoryCatalog("."));
catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
_container = new CompositionContainer(catalog);
_container.ComposeParts(this);
MainWindow.Show();
}
但是,我猜测上面的 XML 序列化并像我一样使用 Type 信息肯定意味着导入将为空,因此暗示我的设计思维模式有误。
我确实设法通过导出 CompositionContainer 使其工作,然后在加载 XML 后我能够做到这一点:
foreach (TestRunnerBase t in testSteps)
{
_container.SatisfyImportsOnce(t);
}
但这对我来说有点不对劲,因为除了获取类型之外,导入的测试步骤的初始列表没有用于任何其他用途。所以我在想我应该将数据导出为 MEF 部件,然后独立导出处理程序,然后当我从 XML 中读取数据列表时,我会以某种方式从列表中请求处理程序?如果这有意义吗?
我无法弄清楚如何以这种方式将它们联系在一起,因为 MEF 组合都在我的 App.xaml.cs 中处理,并且测试步骤在其他地方的视图模型中。我正在考虑使用元数据将数据绑定到处理程序,然后在导入列表中找到相应的处理程序。也许我应该进行初始解析以构建字典以加快查找速度?
这是否更应该这样做?任何帮助表示赞赏,我在头发部门已经很轻了,所以我不能再失去更多
【问题讨论】:
-
您是否通过 MEF 容器创建测试处理程序?您能否发布执行容器和目录创建的代码?
-
我犯了一些错误,事实证明,初始导入不为空。所以我相应地更新了这个问题,因为它实际上与我的想法不同。
-
您看过 MEF 的导出元数据吗? mef.codeplex.com/wikipage?title=Exports%20and%20Metadata