我一直在尝试在一个新项目中使用 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; }
}
谁能告诉我我做错了什么?为什么这仅在我在元数据接口中使用数组时才有效?有没有办法在不使用属性数组的情况下完成这项工作?
在此先感谢您的帮助。