2012-04-10 39 views
0

我遇到此問題RegisterTypePRISM:帶名稱的註冊類型和ContainerControlledLifeTimeManager

container.RegisterType<IFoo, Foo>("Foo", new ContainerControlledLifetimeManager()); 

我創建的每個模塊都會包含一個類似的最後一個寄存器。另一個模塊將實現Foo2,Foo3作爲具體類型。

對於我來說真的有必要包含寄存器類型的名稱,因爲在外部模塊中會用鍵調用這個對象。

問題也是模塊內部,在其construtor需要的IFoo作爲參數(因爲我知道,這樣做是必要的對象是ContainerControlledLifetimeManager),當我設定的功能RequestNavigate並嘗試生成視圖模型:

public class FooViewModel 
{ 
    // here cannot create the object. 
    public FooViewModel(IFoo foo, ...) 
    { .. } 
} 

而且它拋出:

ResolutionFailedException是由用戶代碼未處理。 解析依賴失敗,type =「System.Object」,name =「FooView」。 異常發生while:解析時。例外情況是: InvalidOperation - 當前類型Prism4Demo.ModuleA.IFoo是一個 接口,無法構建。你錯過了一個類型丟失?

回答

2

您也可以在使用DependencyOverride解決

container.Resolve<FooViewModel>(new DependencyOverride<IFoo>(container.Resolve<IFoo>("Foo"))) 

或RegisterType中的ResolvedParameter。

更新:

container.RegisterType<FooViewModel>(
    new InjectionConstructor(new ResolvedParameter<IFoo>("Foo"))); 

您可以使用解決甚至沒有查看只視圖模型。它自動解析ViewModel的依賴關係。

regionManager.RegisterViewWithRegion(RegionNames.LeftRegion, 
    () => this.container.Resolve<FooView>(new DependencyOverride<IFoo> 
     (this.container.Resolve<IFoo>("Foo")))); 
+0

alex,謝謝你的回答。我對ResolvedParameter感興趣,可以從中看到一個例子嗎? – 2012-04-10 21:10:56

0

有2種方法可以做到這一點。一種方法是獲取您的容器,然後通過提供參數「Foo」來解析實例。這不是一個乾淨的方式來做到這一點。您不僅僅限於使用棱鏡提供的DI容器。 Prism還包含ServiceLocator並鏈接到容器。

服務定位器只是用來解決情況下,你會簡單地調用

ServiceLocator.Current.GetInstance<IFoo>("Foo"); 

您確實需要添加一個引用Microsoft.Prism.ServiceLocation.dll