Один из способов сделать это - самостоятельно создать фабрику для регистратора и использовать ее в качестве экспортируемого контракта.
public class Logger : ILogger
{
public Logger(IFoo foo) { }
// ...
}
[Export(typeof(ILoggerFactory))]
public class LoggerFactory : ILoggerFactory
{
[Import]
public IFoo Foo { get; set; }
public ILogger CreateLogger()
{
return new Logger(Foo);
}
}
Затем вы просто импортируете LoggerFactory и каждый раз вызываете CreateLogger, когда вам нужен регистратор. Это почти то же самое, что вы сделали бы, если бы вы импортировали ExportFactory. Недостатком является то, что вам нужно написать отдельную фабрику для каждой вещи, для которой вы хотите иметь возможность создавать несколько экземпляров.
Другим вариантом является добавление ExportProvider в ваш контейнер, который позволяет импортировать фабрики. В последнем сбрасывании MEF на CodePlex имеется образец DynamicInstantiation, который показывает, как это сделать.