Насколько я понимаю, это не может быть указано через универсальный локатор службы.
По умолчанию CreationPolicy.Any
будет рассматриваться как «общий».Чтобы получить экземпляр «без общего доступа», вам необходимо:
- изменить политику создания детали на
CreationPolicy.NonShared
;или - Используйте метод MEF
CompositionContainer.GetExports(ImportDefinition)
;или - Создайте деталь, использующую импорт
ExportFactory
, и запросите ее у ServiceLocator
(см. ниже. Требуется MEF 2 или Silverlight 4 - недоступно в .NET 4.0 RTM MEF.)
То, что вам нужно для третьего варианта, будет выглядеть так:
[Export]
public class ExportFactoryProvider<T>
{
[Import]
public ExportFactory<T> Factory { get; set; }
}
Затем запросите один из них в локаторе службы и используйте свойство factory для создания новых экземпляров.(где IService
- это то, что вы хотите создать для новых экземпляров):
var serviceFactory =
ServiceLocator.Instance.GetService<ExportFactoryProvider<IService>>();
using (var service1 = serviceFactory.Factory.CreateExport())
{
DoSomething(service1.Value);
}
По общему признанию, это выглядит немного странно.Я считаю, что причина неловкости заключается в том, что немногие (нет?) Другие контейнеры IoC поддерживают указание чего-либо вроде CreationPolicy
при запросе службы.