2012-10-19 5 views
3

나는 단 하나의 속성을 가진 인터페이스 인 IConfiguration이라는 클래스가있는 클래스 라이브러리를 가지고 있습니다.적절한 MEF 구성을 설정하는 방법은 무엇입니까?

나는 IConfiguration를 구현 TexasConfiguration라는 클래스 라이브러리와 IConfiguration를 구현 FloridaConfiguration라는 다른 클래스 라이브러리를 가지고있다.

나는 내가 [Export(typeof(IConfiguration)]

ConfigurationSystem라는 클래스를 밀봉 다른 클래스를 TexasConfigurationFloridaConfiguration을 장식하고 그것은 내가 가진 몇 가지 문제가 있습니다 private ConfigurationSystem() {}

로 정의 된 개인 생성자가 포함되어 있습니다. 일반적으로 말하자면, MEF 물건을 어디에 두어야합니까? 현재, 나는 다음과 같은 선언과 함께 ConfigurationSystem에 정적 메서드를 뒀다 :

[Import(typeof(IConfiguration)] 
IConfiguration configuration {get; set;} 

을 위, 그것은 configuration 사용하지 않는 것을 알려줍니다. 이 경우 정상입니다.

public static void SetupConfiguration() 
    { 
     using (DirectoryCatalog catalog = new DirectoryCatalog(@"c:\\developement\source\configuration")) 
     { 
      CompositionContainer container = new CompositionContainer(catalog); 
      container.ComposeParts(typeof(ConfigurationSystem)); 
     } 
    } 

나는 할 수 있도록하려면 : 나는 그것에 typeof(ConfigurationSystem)을 통과해야

는 또한 ConfigurationSystem에 정적 메서드를 만들었지 만이 정적 할 경우, 나는 그것을 this를 전달할 수 없습니다

ConfigurationSystem.SetupConfiguration(); 

그러나이 방법은 정적으로 선언되지 않는 한 수행 할 수 없습니다. 요컨대 응용 프로그램이 시작될 때 SetupConfiguration을 호출하고 적절한 구성 객체를 IConfiguration에 할당 할 정적 메서드 Initialize을 호출합니다.

답변

1

MEF는 정적 인스턴스가 아닌 개체 인스턴스에서 작동하도록 설계되었습니다. container.ComposeParts(typeof(ConfigurationSystem))에 대한 호출은 기본적으로 여기에서 묻는 것은 MEF가 전달한 Type 객체의 부품을 작성하는 것입니다. 분명히 원하는 것은 아닙니다.

간단한 해결책이 있지만 응용 프로그램의 아키텍처를 너무 많이 변경하지는 않습니다. ConfigurationSystem 클래스를 싱글 톤으로 만들면 container.ComposeParts(this)에 전화하여 파트를 얻을 수 있습니다.

+0

문제는 'ConfigurationSystem'이 평균에 의해 작성되지 않고 봉인으로 표시 되었기 때문에 MEF 설정 코드를'ConfigurationSystem' 외부로 이동해야합니까? – Xaisoft

+0

모든 MEF ​​합성 작업을 수행하는 싱글 톤이 될 수있는 부트 스트랩 클래스를 사용합니다. – IAbstract

+0

@Xaisoft'ConfigurationSystem'을 수정할 수 없다는 사실을 이해하는 것은 상당히 어렵습니다. 'Import' 정의가'ConfigurationSystem'에 있고 정적으로 남아 있어야한다면 MEF가 그 값을 설정할 수 없습니다. 그러나 그렇다면 왜 처음에 '수입'으로 작성된 것일까 요? –

관련 문제