Вы можете использовать параметр AllowDefault
. Установка его в true при импорте приведет к зависимости null
, если ни одна доступная деталь не сможет удовлетворить импорт.
public class MyComponent
{
[Import(AllowDefault=true)]
public IMyDependency MyDependency { get; set; }
}
Чтобы загрузить все доступные плагины, но игнорировать те, которые не могут быть загружены из-за отсутствующих частей, [ImportMany]
уже сделает то, что вы хотите по умолчанию:
[Export]
public class MyApplication
{
[ImportMany(typeof(IPlugin))]
public IEnumerable<IPlugin> Plugins { get; set; }
}
Обратите внимание, что вышеупомянутые методы только устраняют ошибки композиции, которые вызваны отсутствующими частями. Если деталь и ее импорт действительно доступны, но при вызове конструктора она вызывает непредвиденные исключения, вы все равно получите исключение. Чтобы игнорировать такие проблемы, которые не связаны с композицией, вы можете вызвать контейнер напрямую следующим образом:
IEnumerable<IPlugin> GetPluginsFromContainer(CompositionContainer container)
{
foreach (Lazy<IPlugin> pluginExport in container.GetExports<IPlugin>())
{
try
{
yield return pluginExport.Value;
}
catch (Exception e)
{
// report failure to instantiate plugin somewhere
}
}
}