2

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() {...}
}
4

0 に答える 0