C# 有关PartCreationPolicy.Any和ServiceLocator.GetInstance()的MEF短问题

C# 有关PartCreationPolicy.Any和ServiceLocator.GetInstance()的MEF短问题,c#,.net,wpf,prism,mef,C#,.net,Wpf,Prism,Mef,我只是想知道我想做的事情是否可行,因为我在网上找不到任何关于它的信息 假设我得到了一个用PartCreationPolicy(CreationPolicy.Any)导出的类。 如果要使用ServiceLocator.Instance.GetInstance()导入它,我可以在哪里指定要使用哪个CreationPolicy导入它?(如果是共享或非共享) 只是在任何地方都找不到关于它的任何信息 谢谢 据我所知,这不能通过通用服务定位器来指定 默认情况下,CreationPolicy。任何都将被视为“

我只是想知道我想做的事情是否可行,因为我在网上找不到任何关于它的信息

假设我得到了一个用PartCreationPolicy(CreationPolicy.Any)导出的类。 如果要使用ServiceLocator.Instance.GetInstance()导入它,我可以在哪里指定要使用哪个CreationPolicy导入它?(如果是共享或非共享)

只是在任何地方都找不到关于它的任何信息


谢谢

据我所知,这不能通过通用服务定位器来指定

默认情况下,
CreationPolicy。任何
都将被视为“共享”。要获取“非共享”实例,您需要:

  • 将零件上的创建策略更改为
    CreationPolicy.NonShared
    ;或者
  • 使用MEF
    CompositionContainer.GetExports(ImportDefinition)
    方法;或者
  • 创建一个使用
    导出工厂
    导入的部件,并从
    ServiceLocator
    请求该部件(请参见下文。需要MEF 2或Silverlight 4-在.NET 4.0 RTM MEF中不可用。)
第三个选项所需的内容如下所示:

[Export]
public class ExportFactoryProvider<T>
{
    [Import]
    public ExportFactory<T> Factory { get; set; }
}

不可否认,这最终看起来有点粗糙。我认为造成这种尴尬的原因是,当请求服务时,很少(没有?)其他IoC容器支持指定类似
CreationPolicy
的内容。

谢谢Nicholas!回答得好!
var serviceFactory =
    ServiceLocator.Instance.GetService<ExportFactoryProvider<IService>>();

using (var service1 = serviceFactory.Factory.CreateExport())
{
    DoSomething(service1.Value);
}