当服务 类 可以做同样的事情时,存储库的目的是什么?

What is the purpose of repository when service classes can do the same?

通常我将逻辑放在服务 类 中而不使用存储库,例如,如下所示:

namespace App\ProjectName\Profile;

use App\User;

class AccountService
{
    private $userModel;

    public function __construct(User $userModel)
    {
        $this->userModel = $userModel;
    }

    public function detail()
    {
        $user = \Auth::User();

        return [
            'id'    => $user->id,
            'name'  => $user->name,
            'email' => $user->email,
            'keys'  => $user->keys,
        ];
    }

    public function addKey($name, $key)
    {
        return $this->userModel->keys()->create([
            'name' => $name,
            'key'  => $key
        ]);
    }
}

我看到了一些示例,通过创建存储库 类 进一步重构。类似 UserController 输入数据,将其发送到 UserCreatorServiceUserCreatorService 获得 UserRepository,后者又获得 UserModel。似乎 UserCreatorServiceUserRepository?

的重复

来自 DDD(领域驱动设计),存储库的职责是负责加载、存储、修改和删除指定数据存储(可能是也可能不是数据库——它甚至可能是数据库)上的实体是一个远程服务器或只是一个文件)。

另一方面,服务有(或应该有)执行一些有用的任务的非常狭窄的责任activity。每个服务单独实例化,然后注入到应用层或以上的代码中,起到桥梁的作用(Bridge pattern)。这种方法已被证明是非常有利的,因为它允许管理其他不相关(非耦合)代码之间的依赖关系。

这两个定义和概念的起源表明它们实际上是非常不同的东西。 纯属偶然,您注意到存储库和服务有明显的重叠,但这是由于实现细节或简单的误用所致。在某些情况下,他们的职责可能会齐头并进(从而产生协作),但它们确实是正交的概念。

此外,存储库应该来自深层(持久性或 DAL,数据访问层)。而服务往往是垂直横切的,或者出现在应用层。

通过适当的分层,存储库和服务之间的差异变得更加明显。

Do not think about them as pure code artifacts you can move around. They are well-defined concepts useful to understand about and design the structure of a system. They decline into actual code only as a consequence of that design.

我希望我写的东西能理清思路,不会造成混淆。

您的问题没有确定的答案,因为您使用的模式在很大程度上取决于项目的复杂性和需求。

但是,服务和代表os是两种不同的东西。 Repository 是模型的通用包装器,也是您将查询写入数据库的地方。在我看来,您不应该在此处添加逻辑,代表os 的唯一目的os 就是将os 数据存储到数据库中。 Repositories的优点是"easiness"可以切换到其他数据库系统。

IMO 服务是您添加所有应用程序逻辑的地方。

有关其他信息,请参阅 this answer

我的项目经理说:

将存储库模式用于普通 PHP。

为 Laravel 项目使用服务模式。

我不知道具体原因。但他有很多知识和经验。