2011-02-08 2 views
2

메뉴에 ms 리본 컨트롤을 사용하는 WPF Windows 응용 프로그램이 있습니다. 인프라 프로젝트에서 모든 모듈에서 참조 할 공유 서비스를 원합니다. 각 모듈은 해당 서비스를 사용하여 모듈에 대해 표시 할 메뉴 항목을 정의합니다.프리즘 v4, MEF 서비스

나는이 Prism+MEF: delayed a service export from prism-module을 읽었지만 다른 모듈이 서비스를 인식 할 수는 없습니다.

서비스

namespace Infrastructure 
{ 
    [ModuleExport("InfModule", typeof(InfModule), InitializationMode = InitializationMode.WhenAvailable)] 
    [PartCreationPolicy(CreationPolicy.Shared)] 
    public class InfModule : IModule 
    { 
     [Export(typeof(IMenuService))] 
     public IMenuService MenuService { get; private set; } 

     public void Initialize() 
     { 
      MenuService = new MenuService(); 

      MenuService.AddItem("test"); 
     } 
    } 
} 

나는 그것의 수입 이후 거짓 출력 디버그 라인 중 하나 기대했을 것이다

namespace Classic 
{ 
    [ModuleExport("Classic", typeof(Classic), InitializationMode = InitializationMode.WhenAvailable)] 
    [ModuleDependency("InfModule")] 
    public class Classic : IModule 
    { 
     private IRegionManager _regionManager; 

     [Import(typeof(IMenuService))] 
     private IMenuService menuService { get; set; } 

     [ImportingConstructor] 
     public Classic(IRegionManager regionManager) 
     { 
      this._regionManager = regionManager; 

      // This shows as true 
      Debug.WriteLine(menuService == null); 
     } 

     public void Initialize() 
     { 
      _regionManager.RegisterViewWithRegion("RibbonRegion", typeof(Views.RibbonTabMenu)); 

      // This shows as true 
      Debug.WriteLine(menuService == null); 
     } 
    } 
} 

모듈. 어떤 생각이 내가 놓친거야?

답변

2

생성자가 실행될 때까지 개체에 대한 속성을 설정할 수 없으므로 생성자를 실행하는 동안 속성 가져 오기가 설정되지 않습니다.

다른 문제는 InfModule에서 내 보낸 값을 너무 늦게 설정하고 있다는 것입니다. MEF는 값을 캐시하고 getter를 다시 호출하지 않은 후에는 내보내기 값을 한 번만 봅니다. 이 경우 Initialize()가 호출되기 전에 내보내기가 발생합니다. 내보내기를 설정하는 논리는 생성자 또는 속성 getter의 코드에서 실행해야합니다.

+0

감사합니다. getter에서 MenuService를 초기화하고 모듈의 ImportingConstructor에 인수로 IMenuService를 추가했습니다. ModuleDependency 행을 주석 처리했으며 여전히 작동합니다 ... 이유는 확실하지 않습니다. –

+1

@Chris Klepis : 모듈 초기화 순서가 원하는 곳으로 떨어지기 때문입니다. ModuleDependency를 추가하면 주문을 원하는 위치에 놓을 수 있습니다. 의존성이 정말로있는 경우 나중에 종속성을 추가하여 나중에 문제가 없는지 확인해야합니다. –

관련 문제