2010-03-31 3 views
5

나는 MEF와 지금 일하고있다. 그러나 내가 찾고있는 대답은 아마도 MEF와 관련이 없다. 모든 의존성 주입이다. 나는 MEF 용어를 예제로 사용하고있다.MEF와 함께 응용 프로그램 서비스를 내보내고 가져 오는 방법은 무엇입니까?

짧은 배경 이야기, 나는 세 가지, 쉘, 응용 프로그램 서비스 및 모듈이있다이 그림에서

Composite Applications에 초점을 맞춘 MSDN에서이 기사를 읽어. 이것은 복합 애플리케이션입니다.

alt text http://i.msdn.microsoft.com/cc785479.fig02(en-us).gif

는 내가 충분히하지 않는 것은 응용 프로그램 서비스의 일부입니다. 서비스 란 무엇입니까? 어떻게 생겼습니까? 모듈을 통해 서비스를 노출하는 방법과 다른 모듈의 서비스를 어떻게 소비합니까?

정말 멋진 코드 예제를보고 싶습니다.하지만이 모든 것이 삶에 어떤 영향을 미치는지 보여줄 수는 없습니다 (응용 프로그램 서비스 부분).

+5

내 눈, 내 눈! –

+0

예, 그 그림의 색상 선택은 끔찍합니다 ... –

답변

3

응용 프로그램 서비스는 MEF와 관련하여 구성 가능한 또 다른 부분입니다. 작성할 수있는 모든 인터페이스 또는 클래스는 서비스처럼 작동 할 수 있습니다.

각 서비스에는 구현하려는 인터페이스 또는 기본 클래스가 있습니다. 어떤 유형의 IService 인터페이스를 통해 이러한 작업을 일괄 적으로 수행 할 수 있으며 (모두 가져 오기 위해 [ImportMany]을 사용) 종종 다른 서비스 유형을 원할 것입니다.

그러면 필요에 따라이를 클래스로 가져올 수 있습니다. 예를 들어, 서비스를위한 공통 인터페이스 라이브러리가 있다고, 당신은 제공 :

[Export(typeof(IDataRepository))] 
public class Repository: IDataRepostory 
{ 
    // implement interface for this specific "service" 
} 

귀하의 주요 프로그램은 다음을 수있을 것입니다 :

public interface IDataRepostory 
{ 
    public IList<MyType> MyTypes { get; } 
} 

당신은 다음 별도의 라이브러리 수출 특정 유형을 가질 수 있습니다 이것을 필요에 따라 임포트하고, 그에 대해 코드를 작성하십시오. 예를 들어 고객을 표시하려면 데이터 계층에서 고객을로드해야합니다. 당신이 당신의 저장소를 통해로드 원하는 경우에, 당신은 당신의 응용 프로그램의 특정 부분으로 저장소를 가져올 수 :

public class CustomersViewModel 
{ 
    [Import] 
    public IDataRepository 
    { 
     get; set; 
    } 

    // ... 
} 

그런 다음이 서비스는 응용 프로그램에 직접 구성 얻을 것입니다.

이것은 응용 프로그램 특정 구현의 일반 서비스이기 때문에 "응용 프로그램 서비스"로 간주됩니다. 이는보기 관련 구성 요소가 아니며 응용 프로그램 전체에서 사용될 수 있습니다.

+0

1 개 이상의 응용 프로그램 서비스가 가져 오기를 만족시키는 경우 두 가지를 구별 할 수 있습니까? 메타 데이터? 또는 더 좋은 방법이 있습니까? 또는 이것은 다만 틀리다.이 상황이 발생했을 때 MEF가 예외를 throw한다는 것을 알고 있습니다. 그렇기 때문에 나는 단지 1 개의 인터페이스와 1 개의 구체적인 구현을 원하나요? –

+0

@ 존 : [ImportMany]를 사용한 다음 서비스를 쿼리하거나 메타 데이터를 사용하여 사용할 서비스를 결정해야합니다. 그렇지 않으면 예외가 발생합니다. –

+0

@ 존 : 여러 서비스가 동일한 가져 오기 인터페이스/클래스를 사용하는 경우 [ImportMany]를 사용하고 IEnumerable로 가져 오기

0

이 인터페이스를 구현하는 서비스 및 내보내기 클래스 용 인터페이스를 선언하십시오. 예를 들어 공유 어셈블리에 선언 된 IPersonBuilder이있을 수 있습니다. 당신은 메인 모듈이 MyPersonBuilder 인터페이스를 구현하고 이것을 내 보냅니다. 모든 뷰는 가져 오기 IPersonBuilder을 사용하여 메소드를 호출하고 기본 모듈의 MyPersonBuilder에서 CreatePerson()이라고 말하면서 호출 할 수있는 MEF 컴포지션을 사용합니다.

관련 문제