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")));

您甚至可以将 Resolve 用于 View 而不是仅用于 ViewModel。它会自动解决 ViewModel 的依赖关系。

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

有两种方法可以做到这一点。一种方法是获取您的容器,然后通过提供参数“Foo”来解析实例。这不是一个真正干净的方法。您不仅限于使用 prism 提供的 DI 容器。Prism 还包含 ServiceLocator 并链接到容器。

服务定位器仅用于解析实例,您只需调用

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

您确实需要添加对 Microsoft.Prism.ServiceLocation.dll 的引用

于 2012-04-10T20:18:34.023 回答