2012-06-22 2 views
0

저는 Caliburn Micro와 nHibernate를 사용하는 새로운 LOB MVVM 프로젝트의 아키텍처를 설계하려고하고 있으며 현재 DI와 IOC를 조사하고 있습니다.MEF는 서비스 검색 자입니까?

Caliburn Micro는 DI \ IOC 메커니즘으로 MEF를 사용합니다.

MEF가 합리적으로 인기가있는 것 같지만 Mef [Imports] 주석의 생각은 서비스 검색 자의 또 다른 맛을 느끼게합니다.

내가 본 거의 모든 예제가 올바르게 사용되지 않았거나 사용 방법에 대해 완전히 이해하지 못했던 MEF에 대한 정보가 누락되어 전체 서비스 위치 지정자 문제를 해결할 수 있습니까?

+0

좋아, 이제는 "적절한"생성자 기반 DI를 사용할 수있는 [ImportingConstructor] 특성에 대해 알게되었습니다. 그러나 문제는 여전히 MEF + [Imports] = Service Locator = Antipattern입니까? –

답변

1

난 당신이 재산 수입했다 단지 new 최대 부분이 있다면 가정 및 사용, 당신은 여기에 설명 된 같은 몇 가지 문제로 실행할 수 있습니다하려고 : Service Locator is an Anti-Pattern

하지만 실제로 당신은 당신의 부분에서 얻을 컨테이너에 추가 allowDefault 속성없이 [Import]을 사용하는 경우 가져 오기를 수행 할 부분을 요청하면 해당 부분이 필요하며 컨테이너가 파열됩니다. 그것은 실행 시간에 폭발 할 것입니다. 그러나 밀 서비스 로케이터의 실행과는 달리, 테스트 프레임 워크를 사용하여 MEF 컨테이너의 정적 분석을 수행하는 것은 매우 간단합니다. 나는 그것에 대해 두 번 herehere을 썼다.

그것은 몇 가지 이유를 들어, 실제로 나에게 문제가되지 않았습니다 :

  1. 내가 컨테이너에서 내 부품을 얻을.
  2. 나는 구성 테스트를 사용합니다.
  3. 프레임 워크 코드가 아닌 응용 프로그램을 작성하고 있습니다.
+0

안녕하세요 짐, 귀하의 의견에 감사드립니다. 나는 코딩을 끝내기 전에 MEF를 건축 도구로 완전히 이해하지 못할 것이라는 느낌을 받기 시작했다.나의 현재의 부족한 점을 설명하기 위해, 위의 당신의 의견은 다음과 같습니다. IOC \ Decoupling 문제를 해결하기 위해 MEF를 사용했지만 이러한 문제를 해결했지만 구성 문제가 너무 복잡하여이를 해결하기 위해 전체 테스트 프레임 워크를 구현해야했습니다. –

+0

아닙니다. 시작하면 테스트는 모든 것이 작동하는 방법을 학습하는 데 도움이됩니다. 모든 것이 어떻게 작동하는지 알게 된 후에는 뼈를 잡는 실수를 포착하는 것이 더 중요합니다. 테스트 프레임 워크의 존재가 시스템이 너무 복잡하다는 것을 암시하는 것이 사실이라면 테스트가있는 시스템에 대해 무엇을 말합니까? 어쨌든, 나는 계속해서 시도해 보거나 다른 것을 시도해 본다. MEF는 내가 시도한 첫 번째 구성 프레임 워크가 아니었지만 현재 내가 좋아하는 프레임 워크입니다. –

+0

모든 진실한 논평, 감사합니다 짐. 나는 곧 뛰어 올거야. –

3

MEF는 서비스 로케이터가 아니며, 자체 서비스입니다. 서비스 로케이터 (Silverlight 버전의 CompositionInitializer은 효과적으로 MEF에 내장 된 서비스 로케이터 임)를 구현하는 데 사용할 수 있지만 직접 종속성 주입을 수행 할 수도 있습니다.

특성이 사용자에게 "냄새가 날"수 있지만 [ImportingConstructor]을 사용하여 작성시 데이터를 주입 할 수 있기 때문에 특성만으로 서비스 로케이터가되지는 않습니다.

실제로 속성은 MEF를 사용하는 유일한 방법이 아니며 대신 direct registration 또는 convention based registration (CodePlex drops 및 .NET 4.5에서 지원됨)을 통해 작동 할 수도 있습니다.

+0

그래, 나는 서비스 로케이터 그 자체가 아니라는 것을 이해한다. (표제는 아마도 내 의도를 적절하게 기술하지 않는다), 나는 현재 그것을 건너려고 노력하고있다. 가져 오기]와 [내보내기]는 매우 단순합니다. [가져 오기]를 Singlton IOC.Resolve()로 대체하십시오.이 예제에서는 내 책의 서비스 위치 지정자입니다. Reed의 의견에 감사드립니다. –