РЕДАКТИРОВАТЬ
components which are then set/hydrated using some custom logic/perhaps from a data store
Это можно сделать с помощью "ExportFactory".
// "ExportFactory"
public sealed class DataStoreProvider
{
[Export(typeof(Model))]
public Model Item
{
get
{
return [custom logic];
}
}
}
public class NeedsModel
{
[Import(typeof(Model))]
public Model Item { get; set; }
}
Начальный ответ
Это возможно с помощью MEF Lazy<T, TMetadata>
.
public interface ISomeMetadata
{
string UsefulInfo { get; }
}
[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple=false)]
public class ExportBaseAttribute : ExportAttribute, ISomeMetadata
{
public ExportBaseAttribute(string usefulInfo)
:base(typeof(BaseExport))
{
UsefulInfo = usefulInfo;
}
public string UsefulInfo { get; private set; }
}
// BaseExport class is not needed.. just showing advanced attribute usage.
public abstract class BaseExport { }
[ExportBase("Useful Filter Information")]
public class SomeExport : BaseExport
{
}
Затем, на вашем хосте (композиторе), вы можете
[ImportMany(typeof(BaseExport))]
Lazy<BaseExport, ISomeMetadata>[] _baseExports
После того, как вы сочините,Вы можете запустить фильтр LINQ, используя .Metadata
var goodExports = from export in _baseExports
where export.Metadata.UsefulInfo ...
select export;