У меня работает приложение WPF, которому нужны все операции, которые влияют на пользовательский интерфейс, в потоке пользовательского интерфейса.WPF также предоставляет класс Dispatcher, который обрабатывает это - поэтому я извлек это в зависимость.
public interface UIActionExecutor
{
void Do(Action action);
}
Так что в моем производственном коде я использую экспортированную реализацию, которая делегирует WPF Dispatcher.Я использую MEF для DI.
Теперь проблема в моих приемочных тестах, мне нужно заменить деталь / объект в контейнере, который отвечает на UIActionExecutor
, на Mock.Поэтому мне нужно удалить ExecutorUsingWpfDispatcher
из моего контейнера и добавить MockUIActionExecutor
на его место.Это звучит довольно просто (если я не использовал MEF) ... но мои навыки поиска не помогли мне найти ответ на вопрос, как сделать это с контейнером MEF?
Обновление: Если кто-то хочет знать, почему и как работает решение, прочитайте Сообщение Глена Блока № 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