2017-03-07 3 views
2

메타 데이터를 기반으로 모듈을 내보내려고합니다. compositioncontainer 두 가지의 카탈로그메타 데이터를 기반으로 한 mef 내보내기

[1] = {Modules.ProjectModule} 
[0] = {Modules.DocumentsModule} 

에서 부품 만 GetExportedValues 아무것도 반환이 포함되어 있습니다.

[ImportMany(typeof(IModule))] 
private List<Lazy<IModule, IModuleInfo>> specific_modules { get; set; } 
public ShellViewModel() 
{ 
    DirectoryCatalog catalaog = new DirectoryCatalog(System.AppDomain.CurrentDomain.BaseDirectory + @"\Modules", "*.*"); 
    CompositionContainer compositioncontainer = new CompositionContainer(catalaog); 
    specific_modules = compositioncontainer.GetExportedValues<Lazy<IModule, IModuleInfo>>().ToList(); 
    Documents = specific_modules.FirstOrDefault<Lazy<IModule, IModuleInfo>>().Metadata.DisplayName; 
} 

public interface IModuleInfo 
{ 
    string DisplayName { get; } 
    string Description { get; } 
    string Version { get; } 
} 

public interface IModule 
{ 
    string Name { get; } 
} 

namespace Modules 
{ 
    [Export(typeof(IModule))] 
    [ExportMetadata("DisplayName", "Documents")] 
    [ExportMetadata("Description", "gérer les docs")] 
    [ExportMetadata("Version", "2.1")] 

    public class DocumentsModule : IModule 
    { 
     public string Name 
     { 
      get 
      { 
       return "Documents"; 
      } 
     } 
    } 
} 

답변

2

문제는이 라인 당신은 당신이 얻을하려는 모듈의 계약의 유형을 지정해야

specific_modules = compositioncontainer.GetExportedValues<Lazy<IModule, IModuleInfo>>().ToList(); 

입니다. 귀하의 경우, 당신은이 작업을 수행해야합니다 :

var listOfModules = compositioncontainer.GetExportedValues<IModule>().ToList(); 

specific_module이 다음 충전 할 수

/을 Select LINQ 방법을 사용하여 형성했다.

출처 :