在MEF中使用元数据访问的多个接口?

时间:2011-09-23 07:10:58

标签: c# interface mef

我创建了三个接口:

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; } }
}

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

[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 ...

请告诉我如何在界面A中获取我的所有界面B导出。

1 个答案:

答案 0 :(得分:1)

可以使用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将自动为您投射。