2011-11-07 73 views
1

只是想知道我想要做什麼是可能的,因爲我無法在網絡中找到任何有關它的信息。關於PartCreationPolicy.Any和ServiceLocator.GetInstance()的短MEF問題

可以說我有一個我用PartCreationPolicy(CreationPolicy.Any)導出的類。 如果我想用ServiceLocator.Instance.GetInstance()導入它,我可以在哪裏指定要使用哪個CreationPolicy導入它? (如果它將共享或非共享)

只是無法找到任何有關它的任何信息。

謝謝!

回答

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; } 
} 

然後,要求其中之一,從服務定位器並使用工廠屬性來創建新實例(其中IService是要實例新實例的東西):

var serviceFactory = 
    ServiceLocator.Instance.GetService<ExportFactoryProvider<IService>>(); 

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

無可否認,這最終看起來有點冒險。我相信造成這種尷尬的原因是很少有(沒有?)其他IoC容器支持在請求服務時指定類似CreationPolicy的任何東西。

+0

謝謝尼古拉斯!很好的答案! – Dror