0

これに問題がありますRegisterType

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

私が作成する各モジュールには、同様の最後のレジスタが含まれます。別のモジュールは、具体的なタイプとしてFoo2、Foo3を実装します。

外部モジュールではキーを使用してこのオブジェクトを呼び出すため、レジスタタイプに名前を含める必要があります。

問題はモジュールの内部にもあり、コンストラクターではパラメーターとしてIFooが必要です(これを行うには、オブジェクトがContainerControlledLifetimeManagerである必要があります)。関数RequestNavigateを設定して、viewModelを生成しようとすると次のようになります。

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

そしてそれは投げます:

ResolutionFailedExceptionは、ユーザーコードによって処理されませんでした。依存関係の解決に失敗しました。type="System.Object"、name="FooView"。例外が発生しました:解決中。例外は次のとおりです。InvalidOperation-現在のタイプPrism4Demo.ModuleA.IFooはインターフェイスであり、構築できません。欠落しているタイプが欠落していますか?

4

2 に答える 2

2

解決中にDependencyOverrideを使用することもできます

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

またはRegisterType中にResolvedParameter。

アップデート:

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

ViewModelだけでなく、ViewでもResolveを使用できます。ViewModelの依存関係を自動的に解決します。

regionManager.RegisterViewWithRegion(RegionNames.LeftRegion,
    () => this.container.Resolve<FooView>(new DependencyOverride<IFoo>
        (this.container.Resolve<IFoo>("Foo"))));
于 2012-04-10T21:08:28.870 に答える
0

これには 2 つの方法があります。1 つの方法は、コンテナーを取得してから、パラメーター「Foo」を指定してインスタンスを解決することです。これは実際にはクリーンな方法ではありません。プリズムが提供する DI コンテナーの使用に限定されるわけではありません。Prism には ServiceLocator も含まれており、コンテナにリンクされています。

サービスロケーターはインスタンスを解決するためにのみ使用され、単に呼び出すだけです

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

Microsoft.Prism.ServiceLocation.dll への参照を追加する必要があります

于 2012-04-10T20:18:34.023 に答える