基于元数据的mef导出

mef export based on metadata

我正在尝试根据元数据导出模块。 compositioncontainer目录中包含两个部分

[1] = {Modules.ProjectModule}
[0] = {Modules.DocumentsModule}

但是 GetExportedValues returns 什么都没有。

[ImportMany(typeof(IModule))]
private List<Lazy<IModule, IModuleInfo>> specific_modules { get; set; }
public ShellViewModel()
{
    DirectoryCatalog catalaog = new DirectoryCatalog(System.AppDomain.CurrentDomain.BaseDirectory + @"\Modules", "*.*");
    CompositionContainer compositioncontainer = new CompositionContainer(catalaog);
    specific_modules = compositioncontainer.GetExportedValues<Lazy<IModule, IModuleInfo>>().ToList();
    Documents = specific_modules.FirstOrDefault<Lazy<IModule, IModuleInfo>>().Metadata.DisplayName;
}

public interface IModuleInfo
{
    string DisplayName { get; }
    string Description { get; }
    string Version { get; }
}

public interface IModule
{
    string Name { get; }
}

namespace Modules
{
    [Export(typeof(IModule))]
    [ExportMetadata("DisplayName", "Documents")]
    [ExportMetadata("Description", "gérer les docs")]
    [ExportMetadata("Version", "2.1")]

    public class DocumentsModule : IModule
    {
        public string Name
        {
            get
            {
                return "Documents";
            }
        }
    }
}

问题出在这一行

 specific_modules = compositioncontainer.GetExportedValues<Lazy<IModule, IModuleInfo>>().ToList();

您需要指定您要获取的模块的合约类型。在你的情况下,你必须这样做:

var listOfModules = compositioncontainer.GetExportedValues<IModule>().ToList();

specific_module 然后可以 filled/formed 通过使用 Select LINQ 方法。

来源: