Oop 考虑到依赖注入,我应该在何处构建嵌套逻辑层中的对象?

Oop 考虑到依赖注入,我应该在何处构建嵌套逻辑层中的对象?,oop,dependency-injection,inversion-of-control,Oop,Dependency Injection,Inversion Of Control,假设我有这样的东西 控制器使用服务 服务具有历史、源和HttpClient Source具有SourceRepository和id。 Source仅在从SourceRepository获取信息后对其他对象有用 历史具有历史存储库和源 下面是PHP+伪代码的混合(为了简单起见)来说明这个场景 公共类源代码 { ... 公共功能构造(接口存储库$repository,int$id) { $this->data=$this->repository->findById($id); } } 公共

假设我有这样的东西

  • 控制器
    使用
    服务
  • 服务
    具有
    历史
    HttpClient
  • Source
    具有
    SourceRepository
    id
    • Source
      仅在从
      SourceRepository
      获取信息后对其他对象有用
  • 历史
    具有
    历史存储库
下面是PHP+伪代码的混合(为了简单起见)来说明这个场景

公共类源代码
{
...
公共功能构造(接口存储库$repository,int$id)
{
$this->data=$this->repository->findById($id);
}
}
公共课历史
{
...
公共功能构建(接口存储库$repository,接口资源$source)
{
...
}
公共函数hasHistory():bool
{
返回$this->repository->exists($this->source->data);
}
公共功能历史()
{
...
}
}
公务舱服务
{
...
公共功能构造(InterfaceHistory$history,InterfaceSource$source,InterfaceHttpClient$httpClient)
{
...
}
公共函数send()
{
如果($this->history->hashhistory()){
返回$this->history->duplicateHistory();
}
返回$this->sendNewRequest();
}
公共函数sendNewRequest()
{
$this->httpClient->postRequest($this->source->data);
}
}
公共类控制器
{
公共功能剂量测量(整数$id)
{
$sourceRepository=newsourcerepository();
$source=新源($sourceRepository,$id);
$historyRepository=新的historyRepository();
$history=新历史($historyRepository,$source);
$httpClient=new Guzzle();
$service=新服务($history,$source,$httpClient);
$service->send();
}
}
现在我有一些关于依赖注入的问题:

  • 所有对象构建是否真的应该保持在最高级别,在本例中是
    控制器
    • 还是对象结构在中间层<>强>>>
  • 如果我使用依赖注入容器,我认为它将无法实例化
    源代码
    ,因为
    id
    。我应该如何解决这个问题

在阅读了更多关于依赖注入、控制反转和(顺便说一句,读得非常棒,由@Steven建议)的内容后,我明白了在我的情况下必须做些什么

关于我的问题:

所有的对象构建真的应该保持在最高级别吗,在这种情况下是控制器

关于最高级别的部分是正确的,其余部分不是。构建对象(也称为对象图)的最佳位置是在合成根中,它非常接近应用程序和/或特定路由的入口点

合成根是一个逻辑层,它的唯一职责是合成对象图。它可能是一个单独的类和/或函数。尽管它可能和另一个东西在同一个文件中,但它仍然是一个单独的层。(再读一遍)

因此,在我的例子中,我要做的是在到达控制器之前,我将创建一个单独的合成类,该类将创建所有必要的内容,并且只将
服务注入
控制器
,这样它就可以调用
$Service->send()


如果我使用依赖注入容器,我认为它将无法实例化源代码,因为id。我应该如何解决这个问题


不对。依赖项注入容器确实可以用动态参数(如标量值或其他)实例化类。

对象图应该在中构建,而不是在UI层中。@Steven我不知道合成根,你传递给我的链接简直太棒了!这使整个情况对我来说非常清楚,非常感谢!我很快就会用我学到的东西写一个答案。