我正在尝试让 MEF2 无属性/基于约定的注册在我的应用程序中工作。我所看到的是,如果我省略该[Export]
属性,则ComposeParts
调用或GetExports
调用都不会产生任何项目。
如果我[Export(typeof(IGuiModule))]
向我的班级添加一个属性,它会被很好地拾取,但会出现(合理的)警告:
“适用于类型 'Core.Models.DeviceListView' 的导出规范约定已被源文件中应用的属性或先前的约定覆盖。”
我在这里错过了什么,或者有错误的期望吗?我被引导相信 MEF2 方法允许您在不需要显式导出属性的情况下导入?
我发现的信息有点杂乱无章,各种来源显示不同的信息(我想随着 MEF 的发展)。
[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class)]
public class ModuleMetadata : Attribute, IModuleMetadata
{
public ModuleMetadata(string aName)
{
Name = aName;
}
public string Name { get; private set; }
}
public class Core
{
[ImportMany(typeof(IGuiModule))]
public List<ExportFactory<IGuiModule, IModuleMetadata>> GuiModuleImports;
public Core()
{
var rb = new RegistrationBuilder();
rb.ForTypesDerivedFrom<IGuiModule>().Export<IGuiModule>();
var catalog = new DirectoryCatalog(@"d:\prog\core\", "*.dll", rb);
var container = new CompositionContainer(catalog);
var gx = container.GetExports<IGuiModule, IModuleMetadata>();
container.ComposeParts(this);
}
}
导出类:
// We appear to *need* this attribute: [Export(typeof(IGuiModule))]
[ModuleMetadata("Device List")]
public partial class DeviceListView : UserControl, IGuiModule
{
public DeviceListView() {...}
}