2013-01-10 3 views
-1

IModuleManager를 사용하여 필요에 따라 Unity PRISM 모듈을 구현하고 있습니다. 모듈의 기능이 필요한 여러 점이 있다고 가정합니다. 모듈이 이미 이전에로드 된 경우에도 각 지점에서 moduleManager.LoadModule("MyModule")으로 전화를 걸 수 있습니까? 재 장전하지 않을거야?필요에 따라 여러 지점에서 모듈로드

그리고이 모범 사례입니까?

감사

+0

MEF : 해당 게시물의 코드 조각은 여기

입니까? 또는 화합? 또는? – Alan

+0

유니티를 사용 중입니다. – Steve

+0

이 질문은 왜 표시된 것입니까? – Steve

답변

-2

this thread의 응답은 Viktor와 동의하지만 LoadModule을 호출하지 않고 IModuleCatalog 및 IModuleManager를 사용하여 ModuleState를 확인하도록 제안합니다.

(...) 

var module = this.moduleCatalog.Modules.FirstOrDefault(m => m.ModuleName == "MyModule"); 
      if (module != null) 
      { 
       if (module.State != ModuleState.Initialized) 
       { 
        moduleManager.LoadModuleCompleted += moduleManager_LoadModuleCompleted; 
        moduleManager.LoadModule("MyModule"); 
       } 
       else 
       { 

        //Initialization logic 

       } 
      } 
     } 

     void moduleManager_LoadModuleCompleted(object sender, LoadModuleCompletedEventArgs e) 
     { 
      moduleManager.LoadModuleCompleted -= moduleManager_LoadModuleCompleted; 

      if (e.ModuleInfo.ModuleName == "MyModule") 
      { 
       //Initialization logic 
      } 
     } 

(...) 
+4

이것은 기술적으로 질문에 대답 할 수 있지만 여기에서 링크 된 자료를 요약하면 좋습니다 (http://meta.stackexchange.com/q/8259). 그렇지 않으면 답은 링크 썩음으로 인해 유용성을 잃을 위험이 있습니다. –

+3

-1 : 링크가 답변이 아닙니다. 그리고 빅토르 (Viktor)에 동의하면 그의 대답을 받아 들여야하며 그 대답에 대한 코멘트에 행복을 써야합니다. –

+0

@LightnessRacesinOrbit Victor의 대답이 유익하고 그가 쓴 것을 기쁘게 생각합니다. 링크의 대답을 사용했기 때문에 여기에 그 이유를 추가했습니다. – Steve

1

당신은 Prism Modularity Quickstart

볼 때 당신은

protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e) 
    { 
     base.OnMouseLeftButtonUp(e); 

     if (!e.Handled) 
     { 
      if ((this.moduleTrackingState != null) && (this.moduleTrackingState.ExpectedInitializationMode == InitializationMode.OnDemand) && (this.moduleTrackingState.ModuleInitializationStatus == ModuleInitializationStatus.NotStarted)) 
      { 
       this.RaiseRequestModuleLoad(); 
       e.Handled = true; 
      } 
     } 
    } 

this.RaiseRequestModuleLoad(); 경우에 조건을 방지 호출이 있음을 유의하시기 바랍니다로드 모듈에 대한 책임이 방법을 찾을 것입니다 ModuleInitializationStatusModuleInitializationStatus.NotStarted이 아닙니다.

나는 다음과 같은 것을 제거하고 발견 얻을려고 :

  1. 당신이 moduleManager.LoadModule("YourModule"); 여러 번 호출 할 때 발생도 예외가 없습니다.

  2. 모듈의 Initialize 메서드는 모듈을 처음로드 할 때만 호출됩니다.

모듈로드는 모듈 어셈블리가 디스크에서 메모리로 전송됨을 의미합니다. 그래서 ... 매번 다시로드되는 경우 정말로 그렇게해서는 안됩니다. 귀하의 질문에 대답하기 만하면 "이게 최선입니까?" 나는 말할 필요가있다. .. 가장 확실한 것은 아니다. 나는 당신이 moduleManager.LoadModule("YourModule");하지만 IMHO를 호출 할 때마다 다시로드되는지 여부를 말할 수 없습니다. 모듈을 한 번만로드해야하므로 모듈을 한 번만로드해야합니다.

관련 문제