2017-11-06 14 views
0

저희 회사에서는 보편적으로 사용할 수있는 간단한 GUI 프레임 워크를 개발하고 있습니다. 필자는 GUI 프레임 워크가 시작될 때 구성 파일을 읽는 것을 원합니다.이 파일은 어떤 플러그인을로드해야하는지, GUI 요소를 배열해야하는지 등을 정의합니다. 그러나 설정 파일을 읽고, 또한 글을 쓰는 일은 플러그인을 통해 이루어져야합니다. 그래서 다른 사람을로드하기 전에 구성 파일을 식별해야하기 때문에이 플러그인을 먼저로드해야합니다. var dirCatalog = new DirectoryCatalog(@"..\..\Extensions\","ProgramConfigManager*");MEF에서 특정 플러그인 만로드 할 수 있습니까?

하지만 파일 이름에 의존하지 않으려 :

나는이 같은 단지 정의 DLL을로드 할 수 있다는 것을 발견했다. 내 의도는 먼저 인터페이스 ISAProgramConfigManagerContent으로 MEF 플러그인을로드하는 것입니다 :이 후

[Import(typeof(ISAProgramConfigManagerContent))] 
SAProgramConfigManagerContent PCM; 

, 다른 플러그인하지만, 설정 파일에 바로 사람들이에로드해야합니다

[ImportMany(typeof(IPlugin))] 
List<IPlugin> Plugins; 

인가 거기에, 그냥 구성 파일을 처리하는 특별한 플러그인을로드하는 방법을 계약을 필터링하고 그냥 ISAProgramConfigManagerContent 중 하나를 작곡?

미리 감사드립니다.

답변

0

다른 어셈블리에서 가져올 때 MEF에게 어떤 파일이 보이는지 알려야합니다. 이것은 디렉터리, 파일 globbing 또는 다른 사용자 지정 방법입니다. 그렇지 않으면 MEF는 수출을 찾을 수있는 방법이 없습니다.

이렇게 말한 후, 먼저 플러그인 관리자를로드하기위한 카탈로그를 설정할 수 있습니다. 그런 다음이를 기반으로 다른 카탈로그를로드하고 플러그인에서 프로그래밍 방식으로 가져올 항목으로 설정하십시오. AggregateCatalog을 사용하여 여러 개의 DirectoryCatalog을 통합 할 수도 있습니다. 같은

뭔가 :

var container = new CompositionContainer(aggregateCatalog); 
IEnumerable<IPlugin> plugins = container.GetExports<IPlugin>(); 
+0

은 "매니저 플러그인"의 경로 또는 이름으로 구별 내가 가고 싶어하지 않는, 단지 방법이었다. 그러나 GetExport는 내가 찾고있는 것일뿐입니다. 'Lazy p = ExtensionCandidates.GetExport ();' 그래서 올바른 유형의 플러그인을 얻었습니다. 고맙습니다! – ProperHacker