2010-07-19 4 views
2

내 응용 프로그램을 사용하면 런타임에 인스턴스화 할 수있는 플러그인 (IPlugin 구현)을 작성할 수 있습니다. 시작할 때 플러그인 .dlls의 디렉토리가 파싱되어 사용 가능한 모든 플러그인 정보가 등록됩니다. 런타임시 사용자가 플러그인의 인스턴스를 작성할 수있는 GUI가 제공됩니다. 이것은 잘 작동합니다.MEF를 사용하여 런타임에 플러그인로드

그러나 지금 나는 MEF를보고 내가 똑같이 할 수 있기를 희망하지만보다 우아한 방법으로 코드를 사용했다.

지금까지 MEF으로 작업하고 있습니다. 시작시에 (IPlugin을 내보내는) 디렉토리의 모든 플러그인을 가져오고 이름, 카테고리, 저자 등의 정보를 읽습니다. 내 보낸 메타 데이터 속성으로 플러그인 클래스에 인코딩됩니다. 가져 오기는 게으 르기 때문에 시작시 모든 플러그인이 인스턴스화되지 않으므로 중요합니다.

문제 지금은 플러그인 생성자가 필요가있는 IPluginHost (에 대한 참조를 가져되는 수입 생성자 추가 합병증 주어진 우아하게 런타임에 선택된 플러그인을 인스턴스화하는 방법을 볼 수 없다는 것입니다 일부 초기화를 즉시 수행합니다).

plugininfo와 함께 시작할 때 해당 내보내기를 사전에 저장하므로 GUI에서 특정 plugininfo가 지정된 플러그 인을 인스턴스화하라는 메시지가 표시되면 Export (Export.Value는 실제 IPlugin 임)에 액세스 할 수 있습니다. 하지만 거기에서 어떻게 플러그인 인스턴스를 만들고 IPluginHost로 구성 할 수 있습니까?

모여 있습니다. 누군가가 요청할 때마다 IPluginHost를 제공하는 자체 ExportProvider를 작성해야하지만 어셈블리에 액세스 할 수 없거나 카탈로그에 추가 할 수있는 특정 플러그인의 유형에 액세스 할 수 없습니다. 카탈로그 및 ExportProvider를 컨테이너에 저장하고 해당 컨테이너의 .ComposeParts를 호출하십시오. 그것은 시작에 게으른로드 플러그인을 구문 분석하는 프로그램을 가지고 MEF에 대한 표준 유스 케이스가 아닌 :

은 내가하지 않으면, 내가 질문의 짧은 버전을 시도하자, 내 문제가 분명히 희망 사용할 수있는 플러그인은 특정 플러그인 인스턴스에 대한 정보를 런타임에 생성합니다. 관련된 단계의 codeoutline을 얻는 것이 좋습니다.

답변

2

제가 올바르게 이해한다면, 잠재적으로 동일한 플러그인의 여러 플러그인 인스턴스를 동적으로 생성하는 방법을 찾고 있습니다.

ExportFactory<IPlugin,IPluginMetadata> 유형의 가져 오기를 선언 한 다음 메타 데이터를 기반으로 올바른 팩토리를 선택해야합니다. ExportFactory.CreateExportIPlugin 인스턴스에서 요구하는 가져 오기 (예 : IPluginHost)를 처리합니다.

ExportFactory은 이전 릴리스의 MEF Silverlight 버전에만 해당합니다. 데스크톱 버전에서 사용하려면 현재 codeplex (MEF 2 - 미리보기 1)의 최신 버전이 필요합니다. 생성자를 통해 ExportFactory을 가져 오는 것과 관련된 알려진 문제가 있으므로 속성을 사용하십시오.

+0

MEF 2 미리보기 1에서 성공을 거두었 으면 .NET 4.0 System.Components.Composition과 충돌이 발생합니다! ExportFactory는 내가 원했던 것입니다. –

+0

늦게 답변드립니다. 내가 설명한 ExportFactory로 내 문제를 해결할 수있었습니다. .net 3.5를 사용하여. – joreg

0

아직 CompositionContainer를 만들었습니까? 이를 사용하여 특정 플러그인 유형을 요청하고 인스턴스화 할 수 있습니다. 카탈로그를 통해 카탈로그를 얻을 수 있습니다. AggregateCatalog를 사용하여 여러 카탈로그를 집계 한 다음 결과를 CompositionContainer의 생성자에 전달할 수 있습니다. 특정 IPlugin 유형을 요청하면 (내보내기 유형을 계속 추적) CompositionContainer에게 플러그인을 인스턴스화하도록 요청할 수 있으며 자동으로 생성자 주입을 수행합니다.

관련 문제