我有一个WPF应用程序正在运行,它需要影响UI的所有操作都在UI线程上。 WPF还提供了一个Dispatcher类来处理这个 - 所以我将它提取到一个依赖项中。如何替换MEF容器中的导出零件/对象?
public interface UIActionExecutor
{
void Do(Action action);
}
所以在我的生产代码中,我使用了一个导出的实现,它委托给WPF Dispatcher。我正在使用MEF进行DI。
现在的问题是,在我的验收测试中,我需要用容器替换容器中响应UIActionExecutor
的零件/对象。所以我需要从我的容器中删除ExecutorUsingWpfDispatcher
,并在其位置添加MockUIActionExecutor
。这听起来很简单(如果我不使用MEF)......但是我的搜索技巧并没有帮助我找到关于如何使用MEF容器做到这一点的答案?
更新: 如果有人想知道为什么/解决方案是如何工作的 - 读Glenn Block's blog post#2。这是我最终使用的
var defaultExportProvider = new CatalogExportProvider(__defaultCatalog);
var catalogOfMocks = new AssemblyCatalog(assemblyExportingMocks);
// order of params important (precedence left to right)
__container = new CompositionContainer(catalogOfMocks, defaultExportProvider);
defaultExportProvider.SourceProvider = __container
这工作,但没有解决我的问题 - 现在'GetExportedValue'返回模拟。但是,创建一个导入IRole的对象仍然使用Real实现。例如'testContainer.GetExportedValue '仍然使用真正的实现。 –
Gishu
2010-10-04 11:33:04
并且与'单元测试'有关,是的,我用了错误的单词。我实际上正在编写一个NUnit的验收测试。 – Gishu 2010-10-04 11:34:11
@Gishu:对不起,我从内存中写下了这个例子,而不是看我的测试,我有这个工作。我编辑了我的答案;该示例应该按照您现在的预期工作。诀窍是使用'CatalogExportProvider.SourceProvider'属性。 – 2010-10-04 16:44:24