代码之家  ›  专栏  ›  技术社区  ›  Stark

应用程序逻辑是否应该访问存储库?

  •  0
  • Stark  · 技术社区  · 5 年前

    考虑到DDD方法,我将一个类移动到一个公共文件夹中,因为它将在模块之间共享。问题是我不知道如何使它与依赖注入和容器一起工作。

    基本上,MenuService generate方法,创建一个autogenerator实例,从MenuRepository传递4个数组;

    MenuService.php

    namespace MP\Application\Services;
    
    use MP\Domain\Repositories\Repository;
    use MP\Application\Generation\AutoGenerator;
    
    class MenuService {
    
        private $repository;   
    
        public function __construct(Repository $repository){
            $this->repository = $repository;
        }
    
        public function generate(){
            // fetch/set $recipes, $menu, $settings;
            $generate = new AutoGenerator($recipesArr, $menuArr, $allIngredients);
        }
    }
    

    唯一的原因 $allIngredients 在这里传递是因为AutoGenerator实例化了另一个名为Scaler的类,main方法被调用 scale($recipe, $percentage, $AllIngredients) 哪是唯一的地方 甚至在autogenerator类中使用。

    class AutoGenerator {
        public function add(...){
            $percentage = new Percentage(...); 
            $scaler = new Scaler();
            $try = $scaler->scale($recipe, $percentage, $this->allIngredients);
    
            if($try->isSuccess()){
                ...
            }
        }
    }
    

    我之所以问这个问题是因为我不确定我必须创建一个类来返回一个数据库查询,这样我就可以在构造函数中传递它了。$recipesArr/$allingredites来自RecipeRepository,$menuArr来自MenuRepository;

    还是应该在scaler构造函数中注入RecipeRepository和MenuRepository?

    MP\Application\Generation\Common\Scaler;
    MP\Application\Generation\AutoGenerator;
    
    SHARED\Domain\Repositories\Ingredients;
    
    MP\Domain\Repositories\RecipeRepository;
    MP\Domain\Repositories\MenuRepository;
    
    0 回复  |  直到 5 年前
        1
  •  0
  •   baHI    5 年前

    应用程序服务应该关心读取和持久化。正确的用法是:

    1. 然后通过其他输入参数调用实体上的方法/属性,或者使用域服务,在其中传入域实体和新输入。
    2. 域服务(或对实体的调用)将对域实体进行更改。这些变化仍在记忆中。

    https://blog.arkency.com/application-service-ruby-rails-ddd/