ddd-在哪里可以实例化Model?

时间:2018-11-28 21:21:40

标签: domain-driven-design ddd-repositories ddd-service

我正在创建仅允许模型存在的架构。因此,如果您尝试使用无效数据实例化模型,则会抛出ModelException。我下面的SomeServiceContract使我们能够检索该服务使用的存储库(为了使事情简单,因为该服务在其构造函数中接收了一个存储库):

interface SomeServiceContract{

    function __constructor(SomeRepositoryContract $repository);

    function getRepository() : SomeRepositoryContrat;

    //option 1
    function addNewUserToCompany(ModelContract $model) : self;

    //option 2
    function addNewUserToCompany(array $data) : self;
}

该存储库界面如下:

interface SomeRepositoryContract{

    function __contruct(ModelsFactoryContract $factory);

    function makeModel(array $data) : ModelsContract;

}

因此,我想知道使用存储库类提供的makeModel(array $data)帮助程序实例化模型的最佳位置是什么(makeModel(array $data)使用ModelsFactory创建一个具有给定数据的新模型(如果有效)。当前,我正在用控制器方法实例化模型,然后将其传递给Service的方法(因此,我使用的是选项1 )。当我在系统中创建新资源时(在我的示例中,我将检查很多业务规则,因此我必须在服务中创建它)我不知道是否应该在内部执行实例化。服务方法,或者可以在其外部实例化,例如:

class SomeController{
...

    function createResource(Request $request, SomeServiceContract $service){

        try{

            $data = [
                'name' => $request->input('name'),
                ...
            ];

            //Option 1: instantiates the model outside and passes it as argument to the service. The service method would now only rise a ServiceException, because the model is validated at instantiation time.
            $model = $service->getRepository()->makeModel($data);
            $service->addNewUserToCompany($model);

            //Option 2: pass the data as an array and instantiate the model inside the method of the service. The method would now thrown an exception of both ModelException and ServiceException types
            $service->addNewUserToCompany($data);



        }catch(ModelException $e){
            ...
        }catch(ServiceException $e){
            ...
        }

    }

...
}

恐怕我可能正在使用一个非常简单的问题来定义一个更强大的解决方案,因为随着项目的扩大,我希望保持一致。 注意:所有合同都是接口。

0 个答案:

没有答案