只是想知道我想要做什么是可能的,因为我在网上找不到任何关于它的信息。
假设我有一个用PartCreationPolicy(CreationPolicy.Any)导出的类。 如果我想用ServiceLocator.Instance.GetInstance()导入它,我在哪里可以指定我想要导入它的CreationPolicy? (如果它是共享或非共享)
在任何地方都找不到任何关于它的信息。
谢谢!
答案 0 :(得分:2)
据我所知,这不能通过通用服务定位器来指定。
默认情况下,CreationPolicy.Any
将被视为“共享”。要获得“非共享”实例,您需要:
CreationPolicy.NonShared
;或者,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
之类的内容。