2017-04-10 3 views
0

내 WPF 앱에 MEF 및 MVVM 패턴을 사용해야합니다.MEF가 자동으로 객체를 확인합니다.

은 사실 나는 뷰 모델은 너무 definied 한 다음 VM을 검색하기위한

[Export] 
[PartCreationPolicy(CreationPolicy.NonShared)] 
class MainVM 
{   
    IServiceA serviceA;   
    IServiceB serviceB; 

    [ImportingConstructor] 
    public MainVM(IServiceA serviceA, IServiceB serviceB) 
    { 
     this.serviceA = serviceA; 
     this.serviceB = serviceB; 

     System.Diagnostics.Debug.WriteLine(serviceA.Time); 
    } 
} 

, 나는이 VMLocator를 사용합니다, 그래서 만든 :

DataContext="{Binding Source={x:Static provider:ViewModelLocator.Instance}, Path=MainVM}" 
: XAML에서

class ViewModelLocator 
{ 
    static ViewModelLocator instance; 

    public MainVM MainVM 
    { 
     get 
     { 
      MainVM output = MefBootstrap.Container.GetExportedValue<MainVM>(); 
      return output; 
     } 
    } 

    protected ViewModelLocator() 
    { 

    } 

    public static ViewModelLocator Instance 
    { 
     get 
     { 
      return instance ?? (instance = new ViewModelLocator()); 
     } 
    } 
} 

라고

이 코드는 실제로 작동합니다.

실현 자동으로 가져 오기 VM이 VMLocator의 속성 선언에만 MEF ExportAttribute [가져 오기]를 사용하는 대신 GetExportValue() 방법을 사용하는 경우 궁금 무엇.

어떤 해결책이 있습니까?

+0

시도해 보셨습니까? 당신이했을 때의 문제는 무엇 이었습니까? – wkl

+0

MainVM이 전혀 해결되지 않았습니다. 나는 시도했다 [가져 오기] 공개 MainVM MainVM {get; 세트; } –

답변

1

수동으로 ViewModelLocator을 만들면 작동하지 않습니다. 수동으로 생성하기 때문에 IoC (MEF)은이 인스턴스 생성을 제어 할 수 없으므로 컨테이너에서 property으로 종속성 (MainVM)이 적용되지 않습니다.

그래서 문제를 해결하기 위해 "모든 솔루션이 있습니까?"

Here은 MVVM 컨텍스트에서 MEF를 활용하는 방법의 예입니다.

PRISM으로 가보겠습니다. 그것은 이미 당신을 위해 해왔습니다. 나는 차라리 바퀴를 특히 재발 명하지 않을 것이다.

+0

PRISM + MEF 솔루션을 살펴 봅니다. 솔직히 부트 스트래핑에 너무 많은 논리가 관련되어 있기 때문에 자신의 길을 계속 유지하는 것이 더 좋습니다 –

+0

MEF 솔루션의 경우 새로운 usercontrol을 생성하는 더 높은 "glue"클래스가 필요합니다. 새로운 뷰 모델을 만든 다음 함께 붙입니다. – Karolis

+0

MEF와 호환되는 오래된 해결책을 사용하게되었습니다. https://wpftutorial.net/ReferenceArchitecture.html 유일한 나쁜 점은 코드 뒤에 약간의 코드가 있지만 컨테이너에서 풀린 것입니다. Hovever는 App.xml 모듈에서 호출되지 않기 때문에 다른 사용자에게보기를 호출하는 방법이 여전히 불분명합니다. –