1

我一直在尝试在一个新项目中使用 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; }
}

谁能告诉我我做错了什么?为什么这仅在我在元数据接口中使用数组时才有效?有没有办法在不使用属性数组的情况下完成这项工作?

在此先感谢您的帮助。

4

0 回答 0