Edw*_*uay 17 containers prism inversion-of-control unity-container
(来自Prism V2 StockTrader示例应用程序中的StockTraderRIBootstrapper.cs文件)
这有什么区别:
ShellPresenter presenter = new ShellPresenter();
Run Code Online (Sandbox Code Playgroud)
还有这个:
ShellPresenter presenter = Container.Resolve<ShellPresenter>();
Run Code Online (Sandbox Code Playgroud)
这样的事情:
Container.RegisterType<IShellPresenter, ShellPresenter>();
Run Code Online (Sandbox Code Playgroud)
但发现它无处可寻.那么容器如何才能了解这些类型呢?它们可以解决它们吗?我在自己的项目中重建了这个并获得"依赖失败的解决方案"错误,那么我在哪里需要注册这个依赖呢?
这里的任何方向/讨论都会有所帮助.
所以,在bootstrapper中,当我注册Shell本身时:
protected override void ConfigureContainer()
{
Container.RegisterType<IShellView, Shell>();
base.ConfigureContainer();
}
Run Code Online (Sandbox Code Playgroud)
然后Container可以解析ShellPresenter类型.那么当我注册Shell类型时,ShellPresenter类型是如何注册的?
好的,所以事实证明你不必注册你想要解决的类型,但你必须注册传递给你想要解决的类型的构造函数的参数(接口)类型,即因为我注入IShellView接口进入我的ShellPresenter的构造函数,我需要注册IShellView类型而不是IShellPresenter类型:
public ShellPresenter(IShellView view) ...
Run Code Online (Sandbox Code Playgroud)
我通过尝试解决类型测试器测试了这个:
Tester tester = Container.Resolve<Tester>();
Run Code Online (Sandbox Code Playgroud)
只要我将SomeClass注入其构造函数:
public Tester(ISomeClass someClass)
Run Code Online (Sandbox Code Playgroud)
在我用容器注册SomeClass之前,我得到了未解决的依赖错误:
Container.RegisterType<ISomeClass, SomeClass>();
Run Code Online (Sandbox Code Playgroud)
然后它工作.这和教育一样令人惊讶.需要沉入其中.我要去喝杯咖啡并考虑一下.
如果有人能详细说明为什么会这样,那将非常感激.
Ray*_*nry 10
如果您尝试解析具体类并且尚未注册实例或子类来满足它,那么Unity将为您构造具体类的实例,解析它具有的任何依赖项.
所以当你要求ShellPresenter,并且还没有注册它时,Unity刚刚为你创建了ShellPresenter,并以ShellView作为参数.
小智 5
你了解基础知识.
有解决需要构造函数参数的类型的重载.或者,您始终可以将类型编码为具有无参数构造函数.
DI容器的要点是,您可以将它们配置为更改为特定接口解析的类型,而无需重新编译软件.您在配置提供程序时提供的代码示例无法在运行时更改.这就是为什么大多数依赖注入器允许您在app.config/web.config /其他一些外部配置文件中配置它们的原因.这样你可以重新配置你的应用程序以注入不同类型而无需重新编译,这是像Unity这样的DI框架的真正力量.
| 归档时间: |
|
| 查看次数: |
14443 次 |
| 最近记录: |