MEF中具有元数据访问的多个接口

本文关键字:接口 访问 元数据 MEF | 更新日期: 2023-09-27 18:09:31

我已经创建了三个接口:

interface A
{
  B obj{ get; }
}
interface B
{ 
  C obj { get; }
}
interface C { }
[Export(typeof(C))]
class class C1 : C
{ 
  //.........
}

[Export[typeof(B)]
[ExportMetadata("Name", "ABC")
class class1 : B
{
  [Import(typeof(C))]
  public C Cvalues;
  public C obj
  {
    get { return Cvalues; }
  }
}
[Export(typeof(B))]
[ExportMetadata("Name", "XYZ")]
class class2 : B
{
  [Import(typeof(C))]
  public C Cvalues;
  public C obj { get { return Cvalues; } }
}

现在,我想导出接口B的元数据到接口A

[Export(typeof(A))
class AA : A
{
  // how i get the B here
  [Import(typeof(B)]
  public B Bvalues;
  public B objB { get { return Bvalues; } }
}

如果我尝试在接口A中创建接口B的属性然后在一次导入B时它会给我输出但是ImportMany呢因为接口B返回ImportMany.

请给我一些想法,我怎么能得到我所有的接口B导出接口a

MEF中具有元数据访问的多个接口

支持通过Lazy<T, TMetdat>实例导入元数据。简单来说,这意味着:

[Import(typeof(B))]
Lazy<B, IDictionary<string, object>> _b;
public B ObjectB { get { return _b.Value; } }
public string NameB { get { return _b.Metadata["Name"]; } }

但是,通常定义一个元数据契约是一个好主意,例如:

public interface INameMetdata
{
    string Name { get; }
}

你可以用它来代替字典:

[Import(typeof(B))]
Lazy<B, INameMetadata> _b;
public B ObjectB { get { return _b.Value; } }
public string NameB { get { return _b.Metadata.Name; } }

使用元数据契约将使您能够使用静态类型的接口实现,MEF将自动为您投影。