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