2017-10-07 14 views
2

뒤에서 ImportAttribute 또는 ImportManyAttribute이 내 보낸 메타 데이터를 내 보낸 형식의 실제 인스턴스와 쌍을 이루기 위해 MEF의 몇 가지 핵심 방법을 사용해야한다고 생각합니다. B의 수출 값을 가져올 때, 나는 다음과 같이 IMetadata 인터페이스를 통해 A 및 관련 메타 데이터를 올바르게 수출 인스턴스가 AData를 검색 할 수 이제MEF에서 ImportAttribute 또는 ImportManyAttribute를 사용하지 않고 내 보낸 메타 데이터를 가져 옵니까?

//the metadata interface 
public interface IMetadata { 
    string Name {get;} 
} 
//the custom ExportAttribute 
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] 
[MetadataAttribute] 
public class CustomExportAttribute : ExportAttribute, IMetadata { 

    public string Name {get;set;} 
} 
//the class which need to be exported (both value and metadata) 
[CustomExport(Name = "someName")] 
public class A { 
} 
//the class which imports the exported value and metadata 
[Export] 
public class B { 
    [Import] 
    public Lazy<A, IMetadata> AData {get;set;} 
} 

: 이러한 속성을 사용하면 다음과 같은 설정으로 잘 작동

var ac = new AggregateCatalog(); 
ac.Catalogs.Add(new DirectoryCatalog(".")); 
var c = new CompositionContainer(ac); 
var b = c.GetExportedValue<B>(); 
var data = b.AData.Value;//some instance of A here 
var mdata = b.AData.Metadata;//some metadata of A here 

그러나이 경우에는 B 클래스를 사용하고 싶지 않습니다. A와 메타 데이터의 인스턴스를 내 보낸 쌍을 어떻게 얻을 수 있습니까? 어떤 클래스 (예 : B)도 사용하지 않으므로 ImportAttribute 속성은이 경우에 사용되지 않습니다. 여기 내가 무엇을 시도했다입니다 :

var ac = new AggregateCatalog(); 
ac.Catalogs.Add(new DirectoryCatalog(".")); 
var c = new CompositionContainer(ac); 
var a = c.GetExportedValue<Lazy<A,IMetadata>>(); 

마지막 줄 위의이 같은 예외 ImportCardinalityMismatchException 예외 :

없음 수출은 제약 조건을 일치 찾을 수 없습니다 : ContractName System.Lazy (테스트. A, Test.IMetadata) RequiredTypeIdentity System.Lazy (해보는 건 어때요, Test.IMetadata)

내가 보낸 값 (유형 인스턴스와 해당 메타 데이터의 쌍을 얻을 수있는 몇 가지 방법이 있어야한다는 생각)를 직접 사용하지 않고 ImportAttribute이 해당 클래스의 일부 속성에 내 보낸 값을 저장하는 데 사용되는 더미 클래스입니다.

이 문제로 도와주세요. 아직 MEF와 프리즘으로 시작하고 있습니다. 당신의 도움을 주셔서 감사합니다!

답변

1

실제로 방법이 있습니다! 내보내기를 다른 클래스에서 가져올 필요가 없습니다. GetExport < T, TMetadataView> 메서드를 사용하십시오. 코드를 기반으로 나는 추가하여에서만 작동했다 :

var wow = c.GetExport<A, IMetadata>(); 

이 단지 당신이 원하는 것을하는 게으른 < T, TMetadataView>

희망이 도움이 반환!

+0

글쎄, 조금 숨겨져있어, 정말로 도움이된다. 고마워. 제가 지금 신경 쓰던 문제는 다른 문제들과 관련되어 있기 때문에 멀리있었습니다. 아직 테스트하지는 않았지만 제대로 작동해야한다고 생각합니다! – Hopeless