Php 您如何处理依赖性很大的服务和依赖性注入?

Php 您如何处理依赖性很大的服务和依赖性注入?,php,dependency-injection,soa,Php,Dependency Injection,Soa,我将依赖项注入用于类似SOA的应用程序 例如,我有一个VoteService,用于对文章和评论进行投票 然后我有4个依赖项,文章、注释、数据库抽象层和投票所需的用户 因此,我的构造函数有4个参数要填写以获取我的对象 我总是听说超过2/3的参数是对糟糕代码设计的警告,我可能同意这一点 也许我的VoteService设计得不好 我可能需要在文章和评论服务中都进行投票 你觉得怎么样 总是听说超过2/3的参数是错误代码设计的警告 完全错误。尤其是在这种情况下。 你是用正确的方法做的(DI)。这里不需要

我将依赖项注入用于类似SOA的应用程序

例如,我有一个VoteService,用于对文章和评论进行投票

然后我有4个依赖项,文章、注释、数据库抽象层和投票所需的用户

因此,我的构造函数有4个参数要填写以获取我的对象

我总是听说超过2/3的参数是对糟糕代码设计的警告,我可能同意这一点

也许我的VoteService设计得不好

我可能需要在文章和评论服务中都进行投票

你觉得怎么样


总是听说超过2/3的参数是错误代码设计的警告

完全错误。尤其是在这种情况下。
你是用正确的方法做的(DI)。这里不需要更改

我可能需要在文章和评论服务中都进行投票

这可能是另一种解决办法。但是你可以自由地留在这个imo。
如果要实现此解决方案,可以使用方法
addVote
创建接口
IVotable

此时,您可以在
Articles/Comments
类中实现此接口,以便执行以下操作:

$a = new Article;
$b = new Comment;
$a->addVote($currentLoggedUser,10); //> Inject only loggedUser (and maybe your DAL)
$b->addVote($currentLoggedUser,10);
总是听说超过2/3的参数是错误代码设计的警告

完全错误。尤其是在这种情况下。
你是用正确的方法做的(DI)。这里不需要更改

我可能需要在文章和评论服务中都进行投票

这可能是另一种解决办法。但是你可以自由地留在这个imo。
如果要实现此解决方案,可以使用方法
addVote
创建接口
IVotable

此时,您可以在
Articles/Comments
类中实现此接口,以便执行以下操作:

$a = new Article;
$b = new Comment;
$a->addVote($currentLoggedUser,10); //> Inject only loggedUser (and maybe your DAL)
$b->addVote($currentLoggedUser,10);
我总是听说超过2/3的参数是对糟糕代码设计的警告

这本身并不是问题。这只是潜在问题的一个指标

这个规则通常适用于公共成员函数,而不是构造函数

这样的经验法则如果你盲目应用,可能会很危险。你可能有问题,也可能一点问题都没有

您的体系结构中可能(或可能不)存在的一些问题示例:

  • 你的投票服务做得太多了,应该分开
  • 您的“投票服务”实际上不是它自己的逻辑概念,只是系统中其他概念的一个方面
  • 您缺少一个概念的抽象(在本例中是一个投票,其中包含一篇文章、注释和用户)
但是我真的需要看更多的代码来告诉你它们是否适用。从你的简短描述来看,听起来你的服务很简单,而且你在考虑问题

我将依赖项注入用于类似SOA的应用程序

在SOA应用程序中,您将拥有用户不应该知道的依赖项。不要将它们暴露给用户。在这种情况下,用户不应该知道DAL

解决这个问题的一种方法是将应用程序的顶层(注入顶级依赖项的顶层)添加一个垫片,并仅向用户公开垫片

编辑:

例如,我有一个VoteService,用于对文章和评论进行投票。。。因此,我的构造函数有4个参数要填写以获取我的对象

依赖项注入不仅仅是构造函数注入。您还可以通过属性(或setter函数)以及在每次方法调用期间注入依赖项。对于每个依赖项,应该使用有意义的选项

你是否总是同时对文章和评论进行投票?你是否总是对同一篇文章和/或同一条评论进行投票?我的猜测是否定的,所以不要在构造函数中传递它们

只传递那些在构造函数中使用之间不会改变的依赖项。在函数的参数列表中传递每次使用时更改的依赖项。通过属性/设置器传递可选依赖项

在您的特定情况下,您可能应该在构造函数中使用
$entityManager
,在构造函数或setter中使用
$configurationService
(取决于它是否可以在没有依赖项的情况下生存),在
addarticlesvote
方法中使用
$articleService
,并使用
addCommentVote
方法中的
$commentService

class VoteService {

  public function __construct($entityManager);

  // Adding this in case you have sensible logic if it isn't present.
  // If it isn't optional (you don't have defaults that make sense to put in this class),
  // then put it back in the ctor
  public function setConfigurationService($configurationService)
  {
    // ...
  }

  public function addArticleVote($articleService) // or $article
  {
    // ...
  }

  public function addCommentVote($commentService) // or $comment
  {
    // ...
  }
}
也许我的VoteService设计得不好

我会评估你是否应该有一个
VoteService
。例如,在
ArticleService
CommentService
类上添加
vote
方法,甚至在您没有描述的
Article
Comment
类上添加
vote
方法可能是有意义的

如果您对这种类型的反馈感兴趣(看看应该如何重构整个类集),那么您应该在上发布另一个问题

我总是听说超过2/3的参数是对糟糕代码设计的警告

这本身并不是问题。这只是潜在问题的一个指标

这个规则通常适用于公共成员函数,而不是构造函数

这样的经验法则如果你盲目应用,可能会很危险。你可能有问题,也可能一点问题都没有

您的体系结构中可能(或可能不)存在的一些问题示例:

  • 你的投票服务做得太多了,应该分开
  • 您的“投票服务”实际上不是它自己的逻辑概念,只是系统中其他概念的一个方面
  • 您缺少一个概念的抽象(在本例中是一个投票,其中包含一篇文章、注释和用户)
<