以下是Prism V2股票交易示例应用程序中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();
}
然后容器就可以解析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>();
那么它就有效了。这既令人惊讶又具有教育意义。需要沉淀。我要去喝咖啡,思考一会儿。
如果有人能详细解释为什么会这样,将不胜感激。