MEF导入的元数据与任何导出都不匹配

时间:2013-03-19 18:54:19

标签: mef

我一直在尝试在一个新项目中使用MEF,并且在进口工作方面遇到一些困难,我无法解释原因。我正在关注MSDN和其他地方的样本,但他们不适合我。这是在.NET 4项目中使用MEF 4.0。

我定义了一份简单的合同:

public interface ICommand
{
    int Execute(string[] args);
}

我实现了一些部分并添加了一些元数据:

[Export(typeof(ICommand))]
[ExportMetadata("Name", "init")]
public class InitCommand : ICommand { ... }

[Export(typeof(ICommand))]
[ExportMetadata("Category", "service")]
[ExportMetadata("Name", "start")]
public class StartServiceCommand : ICommand { ... }

我定义了以下元数据接口:

public interface ICommandMetadata
{
    [DefaultValue(null)]
    string Category { get; }

    string Name { get; }
}

在我的主程序中,我正在创建一个基于目录的导出提供程序,然后尝试编写主程序对象:

internal class Program
{
    [ImportMany]
    private IEnumerabe<Lazy<ICommand, ICommandMetadata>> commands;

    private static int Main(string[] args)
    {
        var assembly = Assembly.GetExecutingAssembly();
        var assemblyExportProvider = new CatalogExportProvider(new AssemblyCatalog(assembly));
        var compositionContainer = new CompositionContainer(assemblyExportProvider);
        assemblyExportProvider.SourceProvider = compositionContainer;
        var batch = new CompositionBatch();
        batch.AddPart(this);
        compositionContainer.Compose(batch);

        return 0;            
    }
}

当我运行上面的代码时,它按预期工作,并且两个部分都已解析。当我更进一步并创建自定义导出属性时,代码停止工作。这是我的自定义元数据属性和更新的部分:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
[MetadataAttribute]
public sealed class CommandAttribute : ExportAttribute
{
    public CommandAttribute() : base(typeof(ICommand))
    {
    }

    [DefaultValue(null)]
    public string Category { get; set; }

    public string Name { get; set; }
}

[Command(Name = "init")]
public class InitCommand : ICommand { ... }

[Command(Category = "service", Name = "start")]
public class StartServiceCommand : ICommand { ... }

通过应用自定义导出属性,我的程序中的命令集合是一个空数组。我更多地使用了这个,我发现如果我将元数据接口中的属性更改为字符串数组,导入将再次起作用:

public interface ICommandMetadata
{
    [DefaultValue(null)]
    string[] Category { get; }

    string[] Name { get; }
}

有人能告诉我,如果我做错了吗?为什么只有在元数据接口中使用数组才能使用它?有没有办法让这项工作不使用属性的数组?

提前感谢您的帮助。

0 个答案:

没有答案