2011-04-10 109 views

回答

3

您需要通過LazyExportFactory延遲創建零件。例如,給我的樣品類型:

[Export(typeof(ILogger)), ExportMetadata("Name", "Console")] 
public class ConsoleLogger : ILogger 
{ 

} 

我需要的元數據接口:

public interface INamedMetadata 
{ 
    string Name { get; } 
} 

然後,我可以導入許多情況爲:

[ImportMany(typeof(ILogger))] 
IEnumerable<Lazy<ILogger, INamedMetadata>> Loggers { get; set; } 

並做出選擇:

public ILogger GetLogger(string name) 
{ 
    return Loggers 
    .Where(l => l.Metadata.Name.Equals(name)) 
    .Select(l => l.Value) 
    .FirstOrDefault(); 
} 
+0

爲了補充說明,這樣做的主要好處是在可能的'ILoggers'列表中,在任何時候只有所選的'ILogger'被實例化。其他可供使用,但在調用「l.Value」之前不會創建實例。 – Apache 2016-07-15 16:24:34