2011-04-10 27 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