뒤에서 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와 프리즘으로 시작하고 있습니다. 당신의 도움을 주셔서 감사합니다!
글쎄, 조금 숨겨져있어, 정말로 도움이된다. 고마워. 제가 지금 신경 쓰던 문제는 다른 문제들과 관련되어 있기 때문에 멀리있었습니다. 아직 테스트하지는 않았지만 제대로 작동해야한다고 생각합니다! – Hopeless