2013-07-03 3 views
3

내가 여러 메타 데이터 옵션 유형 Foo을 내보낼 원인 true으로 설정하면 메타 데이터에는 실제로 원래 메타 데이터의 속성 배열이 포함되므로이 형식으로이 유형을 가져옵니다.사용자 정의 MEF ExportAttribute은 = 사실은 중복

public interface IFooMultiMeta 
{ 
    string[] Name { get; } 
    string[] Version { get; } 
} 

public class Program 
{ 
    [ImportMany] 
    public List<Lazy<IFoo, IFooMultiMeta>> Foos { get; set; } 

    private static void Main() 
    { 
     new Program().MainInternal(); 
    } 

    private void MainInternal() 
    { 
     new CompositionContainer(new AssemblyCatalog(Assembly.GetExecutingAssembly())).ComposeParts(this); 
     foreach (Lazy<IFoo, IFooMultiMeta> lazyFoo in Foos) 
      for (int i = 0; i < lazyFoo.Metadata.Name.Length; i++) 
       Console.WriteLine("* {0} {1}", lazyFoo.Metadata.Name[i], lazyFoo.Metadata.Version[i]); 
     Console.WriteLine(Equals(Foos[0].Metadata, Foos[1].Metadata)); 
     Console.ReadKey(); 
    } 
} 

Foo의 인스턴스 하나에 3 개의 값이 포함 된 메타 데이터가 포함될 것으로 예상됩니다. 그러나 나는 이것을 가지고있다 :

* Baz 2.0 
* Baz 1.0 
* Bar 1.0 
* Baz 2.0 
* Baz 1.0 
* Bar 1.0 
* Baz 2.0 
* Baz 1.0 
* Bar 1.0 
False 

더 나쁜 것은 메타 데이터 인스턴스가 다르기 때문에 중복을 올바르게 필터링 할 수 없다.

질문 : 하나의 클래스를 메타 데이터 속성의 여러 조합을 만족시키는 것으로 올바르게 내보내려면 어떻게해야합니까?

전체 샘플 : http://pastebin.com/WyjN95gr

답변

8

세 수출하는 이유는 당신이 ExportAttribute에서 사용자 정의 수출 메타 데이터를 도출한다는 사실이다. 이것은 각 장식마다 다른 수출이 이루어지고 있음을 의미합니다. 세 가지 장식은 세 가지 수출로 이어집니다.

각 내보내기에 대해 {이름, 버전} 쌍을 모두 가져 오는 이유가 확실하지 않습니다. 내가 ExportMetaFooAttribute로 이름을 변경 한

[MetadataAttribute, AttributeUsage (AttributeTargets.Class, AllowMultiple = true)] 
public class ExportMetaFooAttribute : Attribute, IFooMeta 
{ 
    public string Name { get; private set; } 
    public string Version { get; private set; } 

    public ExportFooAttribute (string name, string version) 
    { 
     Name = name; 
     Version = version; 
    } 
} 

는 수출 속성하지만 수출 메타 데이터 속성이 아니므 :

은 대신 특성에서 파생 사용자 정의 속성을 업데이트 할 수 있습니다 세 가지 수출을 극복하기 위해. 우리가이 클래스를 내보낼 필요가 있음을 지정 ExportAttribute 여분의 필요 지금 볼 수 있듯이

[Export(typeof(IFoo))] 
[ExportMetaFoo("Bar", "1.0")] 
[ExportMetaFoo("Baz", "1.0")] 
[ExportMetaFoo("Baz", "2.0")] 
public class Foo : IFoo 
{ 
    public void Do() 
    {} 
} 

:

는 그런 다음에 Foo 클래스를 변경합니다.

+3

특성이 내보내기 및 메타 데이터 특성이기 때문에 이름/버전 쌍이 여러 번 사용됩니다. 세 가지 내보내기 각각에 대해 세 가지 속성의 값도 메타 데이터로 가져옵니다. – Matt

+0

@Matt Excellent! 설명 주셔서 감사합니다. –