2010-06-07 2 views
2

저는 MEF에 들어가기 직전에 [ImportMany]로 내보낼 수있는 컬렉션의 순서를 어떻게 정의 할 수 있을지 궁금합니다.ImportMany 속성을 사용하여 광고 주문을 정의하는 방법은 무엇입니까?

인터페이스 IService를 구현하는 두 개의 클래스 (Class1, Class2)가 있고 각 구현이 두 개의 다른 라이브러리에 있지만 (두 클래스가 동일 할 수도 있음), Class2 인스턴스를 ImportMany 특성에 의해 정의 된 IEnumerable 컬렉션의 Class1 인스턴스 앞에 만들어야합니다. 따라서 Class1 호출 전에 Class2 호출이 이루어지는 기능의 파이프 라인과 같습니다.

또한 다른 클래스 (Class3는 IService도 구현 함)를 나중에 다른 라이브러리 (예 : 일부 로깅 유틸리티)에서 가져오고 싶습니다. 어떻게 ImportMany 컬렉션의 세 번째 인스턴스를 만들 수 있습니까?

난 당신이 잘못 각도에서이 문제를 접근하고 생각 MEF 관점에서 JD

답변

1

당신은 '게으른'는 먼저로드하고 당신이 컬렉션에 추가 할 때 다음 순서 속성을 확인 할 수 있습니다.

또는 exacly 당신이 뭘하려는 건지의 예를 가지고 this answer을 확인하십시오.

+0

감사합니다. 나는 여전히 MEF를 이해하고있다. –

2

. MEF는 인터페이스와 구현 간의 분리를 권장합니다. 소비자가 구현 순서를 결정하게하려면 구현을 이해해야합니다.

Visual Studio에서 사용하는 접근 방식은 약간 다릅니다. OrderAttribute을 일반적으로 NameAttribute과 함께 사용하여 구현자가 순서를 지정할 수있게합니다. 그러면 소비자는 기본 구현을 이해하지 않고 이름과 순서의 조합을 사용하여 ImportMany의 구현자를 정렬 할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 여전히 약간 혼란 스럽지만, 클라이언트와 관련하여 그는 기능의 파이프 라인으로 본 IService 컬렉션을 갖게 될 것입니다 (우리는 여전히 여기에서 인터페이스와 구현을 구분합니다). 소비자/클라이언트는 주문을 지시하지 않으며 IService [] 컬렉션에있는 주문을 사용할 수 있습니다. 이제 우리가 서비스가 다른 것 (파이프 라인에서)보다 먼저 실행되기를 원하면 어떻게해야할까요? 죄송합니다. 귀하의 답변을 이해하지 못했다면 (명확히 말씀 드렸듯이) –

관련 문제