1
我想问一下,是否可以通过ExportMetadata值导入某个对象?例如,字符串。 或 如果我通过名称和类型声明了一些导出对象,我可以通过只输入类型来导入它们全部?通过MEF中的ExportMetadata属性导入对象
我想问一下,是否可以通过ExportMetadata值导入某个对象?例如,字符串。 或 如果我通过名称和类型声明了一些导出对象,我可以通过只输入类型来导入它们全部?通过MEF中的ExportMetadata属性导入对象
您需要通过Lazy
或ExportFactory
延迟创建零件。例如,给我的样品类型:
[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();
}
为了补充说明,这样做的主要好处是在可能的'ILoggers'列表中,在任何时候只有所选的'ILogger'被实例化。其他可供使用,但在调用“l.Value”之前不会创建实例。 – Apache 2016-07-15 16:24:34