Короткая проблема MEF, касающаяся PartCreationPolicy.Any и ServiceLocator.GetInstance () - PullRequest
1 голос
/ 07 ноября 2011

Просто хотел узнать, возможно ли то, что я пытаюсь сделать, так как я не смог найти никакой информации об этом в сети.

Допустим, у меня есть класс, который я экспортирую с PartCreationPolicy (CreationPolicy.Any). Если я хочу импортировать его с помощью ServiceLocator.Instance.GetInstance (), где я могу указать, с каким CreationPolicy я хотел бы его импортировать? (Если бы это было Shared или NonShared)

Просто нигде не мог найти информацию об этом.

Спасибо!

1 Ответ

2 голосов
/ 07 ноября 2011

Насколько я понимаю, это не может быть указано через универсальный локатор службы.

По умолчанию 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 при запросе службы.

...