当前位置:  开发笔记 > 前端 > 正文

这在Prism/Unity中意味着什么:Container.Resolve <ShellPresenter>()

如何解决《这在Prism/Unity中意味着什么:Container.Resolve<ShellPresenter>()》经验,为你挑选了2个好方法。

(来自Prism V2 StockTrader示例应用程序中的StockTraderRIBootstrapper.cs文件)

这有什么区别:

ShellPresenter presenter = new ShellPresenter();

还有这个:

ShellPresenter presenter = Container.Resolve();

我理解第二个例子是将容器视为工厂,走到它说"我需要一个ShellPresenter类型的实例化对象".

但是,如果我需要发送参数,相当于"new ShellPresenter(1,true)"等等,该怎么办?

而且由于必须告诉Container有关ShellPresenter的信息,我希望在项目中找到ShellPresenter类在容器中注册的地方,例如我期待的

这样的事情:

Container.RegisterType();

但发现它无处可寻.那么容器如何才能了解这些类型呢?它们可以解决它们吗?我在自己的项目中重建了这个并获得"依赖失败的解决方案"错误,那么我在哪里需要注册这个依赖呢?

这里的任何方向/讨论都会有所帮助.

原因不明的答案:

所以,在bootstrapper中,当我注册Shell本身时:

protected override void ConfigureContainer()
{
    Container.RegisterType();
    base.ConfigureContainer();
}

然后Container可以解析ShellPresenter类型.那么当我注册Shell类型时,ShellPresenter类型是如何注册的?

令人惊讶的答案:

好的,所以事实证明你不必注册你想要解决的类型,但你必须注册传递给你想要解决的类型的构造函数的参数(接口)类型,即因为我注入IShellView接口进入我的ShellPresenter的构造函数,我需要注册IShellView类型而不是IShellPresenter类型:

public ShellPresenter(IShellView view) ...

我通过尝试解决类型测试器测试了这个:

Tester tester = Container.Resolve();

只要我将SomeClass注入其构造函数:

public Tester(ISomeClass someClass)

在我用容器注册SomeClass之前,我得到了未解决的依赖错误:

Container.RegisterType();

然后它工作.这和教育一样令人惊讶.需要沉入其中.我要去喝杯咖啡并考虑一下.

如果有人能详细说明为什么会这样,那将非常感激.



1> 小智..:

如果您尝试解析具体类并且尚未注册实例或子类来满足它,那么Unity将为您构造具体类的实例,解析它具有的任何依赖项.

所以当你要求ShellPresenter,并且还没有注册它时,Unity刚刚为你创建了ShellPresenter,并以ShellView作为参数.



2> 小智..:

你了解基础知识.

有解决需要构造函数参数的类型的重载.或者,您始终可以将类型编码为具有无参数构造函数.

DI容器的要点是,您可以将它们配置为更改为特定接口解析的类型,而无需重新编译软件.您在配置提供程序时提供的代码示例无法在运行时更改.这就是为什么大多数依赖注入器允许您在app.config/web.config /其他一些外部配置文件中配置它们的原因.这样你可以重新配置你的应用程序以注入不同类型而无需重新编译,这是像Unity这样的DI框架的真正力量.

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有