2010-08-03 1 views
2

MEF 및 PRISM을 사용하는 응용 프로그램 (테스트 만 있음)이 있습니다.MEF/PRISM 응용 프로그램의 모든 모듈에 싱글 톤 구성 및 노출

특정 인터페이스 을 준수하는 일부 내보내기를로드하고로드되는 모듈의 생성자로 전달하는 것은 꽤 쉽지만 다른 작업을 시도하고 있습니다.

응용 프로그램이 시작되면 IControllerClient의 구현을 가져옵니다. 그런 다음 생성 된 인스턴스를 구성해야합니다 (예 : 셸). 응용 프로그램의 모든 모듈에서 모듈에 액세스해야합니다.

쉘이나 일부 보조자 클래스에 public 속성을 갖고 싶지 않으므로 이 인스턴스는 나쁜 습관으로 간주 될 수 있습니다 ... 그리고 나는 그것을 정말로 좋아하지 않습니다.

업데이트 :우리는 기존의 프레임 워크에 정의 된 인터페이스의 수는

아래의 질문을 한 문구를 수정, 일반적으로 이러한 다양한 애플리케이션에 MEF를 사용하여로드됩니다.

나는 다음과 같은 예를 들어, 프리즘 응용 프로그램에서 모듈로로드 할 수 있었다 :이 경우

[ImportingConstructorAttribute()] 
public HelloWorldView(IDataTransportService dataTransportService, 
         IMessageFactory messageFactory, 
         IDataFactory dataFactory, 
         IDataProcessor dataProcessor, 
         IDataCollector dataCollector) 
{ 
     var client = new ControllerClient(dataTransportService, 
              messageFactory, 
              dataProcessor 
              dataCollector); 
} 

이 모듈은 ControllerClient 클래스의 유효한 인스턴스를 만듭니다. 그러나 대신 생성자 이러한 인터페이스를 통과

은이 같은 모듈 생성자 갖고 싶어 :

[ImportingConstructorAttribute()] 
public HelloWorldView(IClient client) 
{ 
    this.client = client; 
} 

IClient 구현 (ControllerClient)의 생성자 갖는다 ImportingConstructorAttribute을()]를 나는이 시점에서 자동으로 을 삽입 할 것을 기대했지만 ...이 코드를 사용하면 생성자가 결코 도달하지 않습니다.

내가 원하는 것은 응용 프로그램의 모든 모듈에서 사용하는 IClient 인터페이스의 한 인스턴스를 갖는 것입니다. (이제 공유는 MEF 가져 오기의 기본값 임).

이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 왜 모듈 생성자가 IClient 인 을 가져갈 수 없으며 mef에 대한 지식이 없어도 클래스의 인스턴스를이 방식으로 노출하고 싶다면 어떻게해야합니까?

mef/prism 응용 프로그램에서 모든 모듈에서 사용할 수있는이 인스턴스를 어디에서 정의 하시겠습니까? 그리고 이것은 종종 서비스라고 불리는 것입니다 (단결/프리즘으로 서비스 노출에 대한 지침 만 찾을 수 있습니다).

이번에는 내 문제에 대해 더 잘 설명했으면합니다.

업데이트 2 : 기본은 MEF 수입에 대해 공유하고 있기 때문에, 나는 모든 모듈의 IClient 구현을 가져올 수 있지만, 의존성이 MEF, 공유를 위해

+0

PartCreationPolicy를 설정하면 어떤 점이 좋습니까? 이게 네가 필요로하는 것처럼 나에게 들린다. –

+0

아마도 내 문제를 잘못 설명하고 있습니다. 죄송합니다. – TimothyP

답변

2

를 주입하지 왜 그때 알아 내야 기본값이므로 인터페이스를 가져올 때마다 동일한 인스턴스가 처리됩니다.해당 인스턴스의 구성은 클래스의 생성자에서 발생할 수 있습니다. 또는 을 '싱글 톤'서비스 클래스에 구현할 수 있습니다. MEF가 클래스 가져 오기를 완료하면 콜백합니다. 당신은 몇 가지 추가 컨텍스트 정보를 필요로하는 당신이 해결되었습니다 생성자에서 또는 수입 후 클래스를 구성 할 수 없습니다처럼


는 업데이트 된 설명을 읽고, 그것을 소리. 이 경우 수행 할 수있는 작업은 셸에서 수동으로 클래스를 구성하고 컨테이너의 ComposeParts 메서드를 사용하여 만든 후에 내보내기를 수동으로 추가하는 것입니다. 그러면 '구성한'인스턴스가 클래스에 적용한 [내보내기] 태그를 확인하는 데 사용할 인스턴스가됩니다. 물론 인스턴스를 사용하는 컨테이너를 통해 다른 것을 구성하기 전에이 작업을 수행해야합니다.

+0

시도해 보겠습니다. 합리적인 것 같네요. – TimothyP

+0

매력처럼 작동합니다. 나는 Container.ComposeExportedValue (클라이언트)를 사용했다. 내 클라이언트 부트 스트 래퍼 클래스에서 클라이언트 인스턴스가 구성된 후. 이제 모듈의 생성자는 단순히 클라이언트를 사용합니다 :-) 감사합니다! – TimothyP