(来自Prism V2 StockTrader 示例应用程序中的StockTraderRIBootstrapper.cs文件)
这有什么区别:
ShellPresenter presenter = new ShellPresenter();
还有这个:
ShellPresenter presenter = Container.Resolve<ShellPresenter>();
- 我知道第二个示例是将容器视为工厂,走到它面前说“我需要一个 ShellPresenter 类型的实例化对象”。
- 但是,如果,例如我需要发送参数,什么是“new ShellPresenter(1, true)”等的等价物呢?
- 而且由于容器必须被告知 ShellPresenter,我希望在项目中的某个地方找到 ShellPresenter 类向容器注册的地方,例如,我期待
像这样的东西:
Container.RegisterType<IShellPresenter, ShellPresenter>();
但无处可寻。那么容器如何知道这些类型以便它能够解决它们呢?我在自己的项目中重建了它并得到“依赖项的解决失败”错误,那么我需要在哪里注册这个依赖项?
这里的任何方向/讨论都会有所帮助。
无法解释的答案:
因此,在引导程序中,当我注册 Shell 本身时:
protected override void ConfigureContainer()
{
Container.RegisterType<IShellView, Shell>();
base.ConfigureContainer();
}
那么 Container 可以解析 ShellPresenter 类型。那么我注册Shell类型的时候, ShellPresenter类型是怎么注册的呢?
令人惊讶的答案:
好的,事实证明,您不必注册您尝试解析的类型,但您必须注册传递给您尝试解析的类型的构造函数的参数(接口)类型,即因为我注入IShellView 接口到我的 ShellPresenter 的构造函数中,我需要注册 IShellView 类型而不是 IShellPresenter 类型:
public ShellPresenter(IShellView view) ...
我通过尝试解析类型Tester对此进行了测试:
Tester tester = Container.Resolve<Tester>();
只要我将SomeClass注入它的构造函数:
public Tester(ISomeClass someClass)
在向容器注册SomeClass之前,我得到未解决的依赖错误:
Container.RegisterType<ISomeClass, SomeClass>();
然后它工作。这既令人惊讶,又具有教育意义。需要沉下心来。我要去喝杯咖啡,想一想。
如果有人能详细说明为什么会这样,将不胜感激。