2011-02-05 3 views
9

Managed Extensibility 프레임 워크를 사용하여 방금 놀았습니다. 내 보낸 수업 및 가져 오기 진술 있어요 :ImportMany 및 ExportMetadata를 사용하는 MEF

[Export(typeof(IMapViewModel))] 
[ExportMetadata("ID",1)] 
public class MapViewModel : ViewModelBase, IMapViewModel 
{ 
} 

    [ImportMany(typeof(IMapViewModel))] 
    private IEnumerable<IMapViewModel> maps; 

    private void InitMapView() 
    { 
     var catalog = new AggregateCatalog(); 
     catalog.Catalogs.Add(new AssemblyCatalog(typeof(ZoneDetailsViewModel).Assembly)); 
     CompositionContainer container = new CompositionContainer(catalog); 

     container.ComposeParts(this); 
     foreach (IMapViewModel item in maps) 
     { 
      MapView = (MapViewModel)item;     
     } 
    } 

이것은 잘 작동합니다. IEnumerable은 내 보낸 클래스를 가져옵니다. 아니오 나는 (이전과 같은 수출) 내가 필요로하는 클래스를 필터링 할 수 있도록이 IEnumerable에서에 요소가없는 한이 게으른 목록을 사용하여 메타 데이터를 포함하는

[ImportMany(typeof(IMapViewModel))] 
    private IEnumerable<Lazy<IMapViewModel,IMapMetaData>> maps; 

    private void InitMapView() 
    { 
     var catalog = new AggregateCatalog(); 
     catalog.Catalogs.Add(new AssemblyCatalog(typeof(ZoneDetailsViewModel).Assembly)); 
     CompositionContainer container = new CompositionContainer(catalog); 

     container.ComposeParts(this); 
     foreach (Lazy<IMapViewModel,IMapMetaData> item in maps) 
     { 
      MapView = (MapViewModel)item.Value; 
     }    
    } 

을 변경하려고합니다. 어딘가에서 분명하고 어리석은 실수를 범했다고 생각합니다.

+0

메타 데이터 인터페이스는 어떤 모습입니까? –

+0

메타 데이터를 포함하여 ImportMany를 수행 할 수 있는지 여부를 몰랐습니다. 좋은! – juFo

답변

8

메타 데이터 인터페이스가 내보내기의 메타 데이터와 일치하지 않기 때문에 일치하지 않는 것 같습니다. 당신이 보여준 샘플 수출을 일치 시키려면, 메타 데이터 인터페이스는 다음과 같아야합니다

public interface IMapMetaData 
{ 
    int ID { get; } 
} 
+0

나는 그것이 어리석은 무엇인가 알고 있었다, 단지 그것을 볼 수 없었다. 제 인터페이스에서 ID는 문자열이었습니다 ... – Furnes

0

이 클래스에서 파생 된 클래스에 메타 데이터를 추가하려면 InheritedExport이 적용되어있는, 당신은 또한 같은 InheritedExport 속성을 적용해야합니다 파생 클래스에. 그렇지 않으면 파생 클래스에 추가 된 메타 데이터가 숨겨져 사용할 수 없습니다.

즉, Lazy<T,TMetadata>을 사용하여 적용된 메타 데이터에 액세스하고 가져 오기가 채워지지 않으면 모든 파생 클래스에 InheritedExport을 적용하지 않았을 수 있습니다.

대신 InheritedExport 대신 Export을 적용하면 부품의 다른 인스턴스가 종료됩니다.