Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 领域驱动设计和factory类的作用_Design Patterns_Domain Driven Design - Fatal编程技术网

Design patterns 领域驱动设计和factory类的作用

Design patterns 领域驱动设计和factory类的作用,design-patterns,domain-driven-design,Design Patterns,Domain Driven Design,我不清楚工厂类的角色和责任是什么。我知道工厂类应该负责创建域对象(聚合根)及其关联的实体和值对象 但我不清楚的是,DDD体系结构的工厂“层”在哪里?工厂应该直接调用存储库来获取其数据还是服务库 工厂在以下框架中的位置: 用户界面>应用程序>域>服务>数据 此外,由于工厂是唯一允许创建对象的地方,如果您想在数据层和服务层中创建对象,是否会得到循环引用 如果factory类的角色用于对象创建,那么服务层有什么好处 我问了很多问题,非常感谢您的回复。我缺少的是一个示例应用程序,它演示了一个领域驱动设计

我不清楚工厂类的角色和责任是什么。我知道工厂类应该负责创建域对象(聚合根)及其关联的实体和值对象

但我不清楚的是,DDD体系结构的工厂“层”在哪里?工厂应该直接调用存储库来获取其数据还是服务库

工厂在以下框架中的位置:
用户界面>应用程序>域>服务>数据

此外,由于工厂是唯一允许创建对象的地方,如果您想在数据层和服务层中创建对象,是否会得到循环引用

如果factory类的角色用于对象创建,那么服务层有什么好处


我问了很多问题,非常感谢您的回复。我缺少的是一个示例应用程序,它演示了一个领域驱动设计项目中的所有层是如何组合在一起的……有什么问题吗?

DDD的人和我可能会争论这个问题,但“工厂”类的基本思想是发布领域对象。然后域对象访问数据并成为您正在使用的域的“模型”的一部分

应用程序包含UI等,它不是继承层次结构

小心那个“类型”的操作员;很多人认为,因为他们可以使用继承,所以他们必须使用继承。聚合(“包含”或“有a”而不是“是a”)通常是更好的选择

更新 不一定。想想域告诉你的:这类似于“我需要一个产品,我知道产品的产品编号。当产品工厂完成时,我希望得到代表我产品的完全填充对象。”当你创建产品对象时,它需要做什么才能成为表示特定产品的有效产品对象

但我不清楚的是在哪里 工厂的“层”由DDD构成 建筑学工厂应该被关闭吗 直接调用存储库 获取其数据或服务 图书馆

工厂应该是构建域对象的一站式工厂。需要这样做的代码的任何其他部分都应该使用工厂

通常,至少有三个数据源用作域对象构造工厂的输入:来自UI的输入、来自持久性的查询结果和有域意义的请求。因此,为了回答您的特定问题,存储库将使用工厂

这里有一个例子。我在这里用编辑:忽略此模式的使用。我开始意识到这一点

在域层中,单元测试可能:

Customer carl = customerRepo.findByName("Carl");
List<Product> weapons = productRepo.findAllByName("Ruger P-95 9mm");
Order weaponsForCarl = orderFactory.createWith(carl, weapons);

weaponsForCarl.place();

assertTrue(weaponsForCarl.isPlaced());
assertTrue(weaponsForCarl.hasSpecialShippingNeeds());
Customer carl=customerRepo.findByName(“carl”);
列表武器=productRepo.findAllByName(“Ruger P-95 9mm”);
Order weaponsForCarl=orderFactory.createWith(卡尔,武器);
武器库位置();
assertTrue(武器库替换());
资产真实(武器拥有特殊的运输需求());
这家工厂在什么地方适合这家工厂 以下框架:UI>应用程序>域>服务>数据

域名

还有,因为工厂是唯一的 允许创建对象的位置 你不会得到循环引用吗 如果要创建对象 在您的数据和服务层中

在我的示例中,所有依赖项都从上到下流动。我使用(PDF链接)来避免您提到的问题

如果工厂类的角色是 那么对于对象创建有什么好处呢 服务层是否有

当您有不适合任何单个域对象的逻辑,或者您有涉及编排多个域对象的算法时,请使用服务。该服务将封装任何不适合其他任何内容的逻辑,并将其委托给适合的域对象

在我在这里涂鸦的示例中,我设想为订单制定一个行程将涉及多个域对象。OrderFactory可以委托给这样的服务

顺便说一句,您描述的层次结构可能是UI>应用程序>域服务>域>基础结构(数据)

我问了很多问题,也问了很多问题 感谢您的回复。我是什么 缺少的是一个示例应用程序 演示如何在 领域驱动设计项目 一起…有什么事吗 在那里

吉米·尼尔森的作品是对埃里克·埃文斯的一大赞美。它有很多代码示例,尽管我不知道是否强调分层。分层可能很棘手,几乎是与DDD分开的一个主题

在埃文斯的书中,有一个非常小的分层示例,你可能想看看。分层是一种企业模式,Martin Fowler写道,您可能会发现这也很有用

工厂应该直接调用存储库来获取其数据还是服务库

我也不会说,如果可能的话,应该直接向它传递它需要的信息

这家工厂在什么地方适合这家工厂 以下框架:UI>应用程序>域>服务>数据

不确定这层是从哪里来的,DDD中的层不是固定的,但我想说你最好专注于这种风格

用户界面>应用程序>域

在域中,您将拥有多种类型的对象,我将为它们之间的关系设置规则:


  • 工厂应该获得他们工作所需的一切,因此在大多数情况下,我不会让他们呼叫其他服务或存储库
  • 在大多数情况下,实体不应该联系存储库,相反,服务(或其他上层)应该负责这项工作
  • 实体不应调用服务,服务位于实体/价值对象/规范之上并协调它们
    interface OrderFactory
    {
        Order createWith(Customer owner, Product ordered);
        Order createFrom(OrderEntryScreenExport to);
        Order createFrom(List<String> resultSets);
    }
    
    public List<Order> findAllMatching(Criteria someCriteria)
    {
        ResultSet rcds = this.db.execFindOrdersQueryWith(someCriteria.toString());
        List<List<String>> results = convertToStringList(rcds);
    
        List<Order> returnList = new ArrayList<Order>();
    
        for(List<String> row : results)
            returnList.add(this.orderFactory.createFrom(row));
    
        return returnList;
    }
    
    public void submitOrder(OrderEntryDTO dto)
    {
        Order toBeSubmitted = this.orderFactory.createFrom(dto);
    
        this.orderRepo.add(toBeSubmitted);
    
        // do other stuff, raise events, etc
    }
    
    Customer carl = customerRepo.findByName("Carl");
    List<Product> weapons = productRepo.findAllByName("Ruger P-95 9mm");
    Order weaponsForCarl = orderFactory.createWith(carl, weapons);
    
    weaponsForCarl.place();
    
    assertTrue(weaponsForCarl.isPlaced());
    assertTrue(weaponsForCarl.hasSpecialShippingNeeds());
    
    IUser user = userFactory.Create(name, email);
    
    userRepository.Insert(user);