2009-07-21 2 views
0

내 프리즘 응용 프로그램에서 오류가 발생했습니다 CustomerModule, \ "\" 유형의 인스턴스를 가져 오는 동안 활성화 오류가 발생했습니다.프리즘 (Prism)에서 유형 대신 모듈을 모듈 작성기에 삽입하려면 어떻게해야합니까?

그것은 내 고객 모듈 내가 유형 IMenuManager의 "menuManager"을 주입하기 위해 노력하고 있다는 사실에 의한 것 : 나는 를 주입하기 위해 CustomerModule 생성자를 변경하는 경우,

namespace CustomerModule 
{ 
    public class CustomerModule : IModule 
    { 
     private readonly IRegionManager regionManager; 
     private readonly IUnityContainer container; 
     private readonly IMenuManager menuManager; 

     public CustomerModule(IUnityContainer container, 
      IRegionManager regionManager, 
      IMenuManager menuManager) 
     { 
      this.container = container; 
      this.regionManager = regionManager; 
      this.menuManager = menuManager; 
     } 

     public void Initialize() 
     { 

      container.RegisterType<IMenuManager, MenuManager>(new ContainerControlledLifetimeManager()); 
     ... 

그러나 대신 인터페이스의을 입력 는이 작동 :

public CustomerModule(IUnityContainer container, 
    IRegionManager regionManager, 
    MenuManager menuManager) 

그래서 IMenuManager를 구현하기 위해 MenuManager를 등록해야합니까? CustomerModule의 Initialize 메서드에 등록하는 것이 너무 늦은 것 같습니다.

는 답변 :

나는 ConfigureContainer()에 넣어 그것은 ") (base.ConfigureContainer"에 두십시오 괜찮 았는데 : 당신은 아마 그 때문이다 깨달았다으로

protected override void ConfigureContainer() 
{ 
    base.ConfigureContainer(); 
    Container.RegisterType<MenuManager>(new ContainerControlledLifetimeManager()); 
} 
+0

나는이 방법의 변경을 고려하고 있습니다. 모듈에는 여전히 MenuManager 유형에 대한 구체적인 참조가 있어야합니다. 나는 내가 여기 게시 한 샘플에서 당신을 위해 배치 한 패턴을 따르라고 촉구합니다. http://stackoverflow.com/questions/1152282/looking-for-prism-example-of-modules-loading-themselves-into -a-menu/1154924 # 1154924 –

답변

3

등록하려는 동일한 모듈에서 MenuManager를 요청하는 이유는 무엇입니까?

MenuManager가 외부 모듈에서 제공해야한다고 생각하지 않는 한, 모듈이 종속되어있을 경우이 등록을 부트 스트 래퍼에 넣는 것이 좋습니다. 부트 스트 래퍼의 ConfigureContainer 메소드에 넣을 수 있습니다.

+0

GetModuleCatalog()에서 작동하지만 ConfigureContainer에 대해 알지 못해서 지금 거기에 넣어 줘서 고마워. –

1

생성자는 initialise 메서드보다 먼저 호출됩니다.

두 솔루션은 다음과 같습니다

1) 때 프로그램로드라는 방법 먹으 렴하여 쉘 프로젝트에서 ShellBootstrapper 클래스가 있습니다.

부트 스트 래퍼에있는 메소드가 모든 globabl에 컨테이너의 인터페이스를 등록하도록하십시오.

2) 또는 생성자에서 IMenuManager를 가져 와서 등록한 후에 그냥 해결하십시오.

public void Initialize() 
{ 
    container.RegisterType<IMenuManager, MenuManager>(new ContainerControlledLifetimeManager()); 
    this.menuManager = container.Resolve<IMenuManager>(); 
} 

희망이 있습니다.

관련 문제