據我所知,這不能通過一個通用的服務定位器來指定。
默認情況下,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
的任何東西。
謝謝尼古拉斯!很好的答案! – Dror