Я хотел бы спросить, можно ли импортировать какой-либо объект по значению ExportMetadata? Например, строка. Или, если я объявил некоторые объекты экспорта по имени и типу, могу ли я импортировать их все только по типу?

1
hokus 10 Апр 2011 в 18:19

1 ответ

Вам нужно будет отложить создание детали через 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();
}
3
Matthew Abbott 11 Апр 2011 в 22:08
Чтобы добавить к этому, основное преимущество этого заключается в том, что в списке возможных ILoggers только выбранный ILogger создается в любой момент времени. Остальные доступны для использования, но экземпляры не будут созданы, пока не будет вызван l.Value.
 – 
Apache
15 Июл 2016 в 19:24