(来自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();
然后它工作.这和教育一样令人惊讶.需要沉入其中.我要去喝杯咖啡并考虑一下.
如果有人能详细说明为什么会这样,那将非常感激.
如果您尝试解析具体类并且尚未注册实例或子类来满足它,那么Unity将为您构造具体类的实例,解析它具有的任何依赖项.
所以当你要求ShellPresenter,并且还没有注册它时,Unity刚刚为你创建了ShellPresenter,并以ShellView作为参数.
你了解基础知识.
有解决需要构造函数参数的类型的重载.或者,您始终可以将类型编码为具有无参数构造函数.
DI容器的要点是,您可以将它们配置为更改为特定接口解析的类型,而无需重新编译软件.您在配置提供程序时提供的代码示例无法在运行时更改.这就是为什么大多数依赖注入器允许您在app.config/web.config /其他一些外部配置文件中配置它们的原因.这样你可以重新配置你的应用程序以注入不同类型而无需重新编译,这是像Unity这样的DI框架的真正力量.