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

时间:2011-11-07 15:19:06

标签: c# .net wpf prism mef

只是想知道我想要做什么是可能的,因为我在网上找不到任何关于它的信息。

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

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

谢谢!

1 个答案:

答案 0 :(得分:2)

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

默认情况下,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);
}

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