Несколько интерфейсов с доступом к метаданным в MEF? - PullRequest
1 голос
/ 23 сентября 2011

Я создал три интерфейса:

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

Если я попытаюсь создать свойство интерфейса B в интерфейсе A, то при одном импорте B это даст мне вывод, но как насчет ImportMany, потому что интерфейс B возвращает ImportMany ...

Пожалуйста, дайте мне некоторую идею, как я могу получить весь мой экспорт интерфейса B в интерфейсе A.

1 Ответ

1 голос
/ 23 сентября 2011

Метаданные могут быть импортированы с использованием экземпляра 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; }
}

, который вы можете использовать вместо словаря:1008 *

[Import(typeof(B))]
Lazy<B, INameMetadata> _b;

public B ObjectB { get { return _b.Value; } }

public string NameB { get { return _b.Metadata.Name; } }

Использование контрактов метаданных позволит вам использовать реализацию интерфейса со статической типизацией, которую MEF автоматически спроектирует для вас.

...