但我不清楚在DDD架构中,工厂“层”位于哪里? 工厂是否应直接调用存储库以获取其数据或服务库? 工厂应该是构建域对象的一站式商店。 需要执行此操作的代码的任何其他部分都应使用工厂。 通常,至少有三个数据源用作域对象构建的工厂的输入:来自UI的输入,持久性查询的结果和具有域含义的请求。 因此,回答您的具体问题,存储库将使用工厂。 这是一个例子。 我在这里使用
Holub的Builder模式。
编辑:请忽略使用此模式。 我已经开始意识到它
与DDD工厂混合得不太好。
class Order
{
private Integer ID;
private Customer owner;
private List<Product> ordered;
private Product featured;
private Itinerary schedule;
void importFrom(Importer importer) { ... }
void exportTo(Exporter exporter) { ... }
... insert business logic methods here ...
interface Importer
{
Integer importID();
Customer importOwner();
Product importOrdered();
}
interface Exporter
{
void exportID(Integer id);
void exportOwner(Customer owner);
void exportOrdered(Product ordered);
}
}
interface OrderEntryScreenExport { ... }
class UIScreen
{
public UIScreen(OrderEntryDTO dto) { ... }
}
class OrderEntryDTO implements OrderEntryScreenExport { ... }
这是OrderFactory的样例代码:
interface OrderFactory
{
Order createWith(Customer owner, Product ordered);
Order createFrom(OrderEntryScreenExport to);
Order createFrom(List<String> resultSets);
}
特色产品的逻辑和行程生成都在OrderFactory中。
现在,以下是每个实例中如何使用工厂。
在OrderRepository中:
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());
在以下框架中,工厂类应该放在哪里?UI > App > Domain > Service > Data
Domain层。
同时,由于工厂类是唯一允许对象创建的地方,如果您想在数据层和服务层中创建对象,不会出现循环引用吗?
在我的示例中,所有依赖关系都从上到下流动。我使用依赖反转原则(PDF链接)来避免您所说的问题。
如果工厂类的角色是对象创建,那么服务层有什么好处呢?
当您有逻辑无法适应任何单个领域对象时,或者您有一个涉及协调多个领域对象的算法时,请使用服务。服务将封装任何不适合放在其他位置的逻辑,并在适合的地方委托给领域对象。
在我画的这个例子中,我想为订单制定行程需要涉及多个领域对象。OrderFactory可以委托给这样的服务。
顺便说一句,您描述的层次结构应该是 UI > App > 领域服务 > Domain > 基础设施(Data)
我问了很多问题,感谢您的回答。我缺少的是一个演示如何将领域驱动设计项目中的所有层组合在一起的示例应用程序...有类似的吗?
没有直接相关的完整示例应用程序,但可以找到一些开源的应用程序,例如eShopOnWeb和NopCommerce等。
应用领域驱动设计和模式作者Jimmy Nilsson的书是Eric Evans的领域驱动设计的很好补充。它有很多代码示例,虽然我不知道是否强调分层。分层可能很棘手,几乎是DDD之外的一个主题。
在Evans的书中,有一个非常小的分层示例,您可能想要查看。分层是一种企业模式,Martin Fowler撰写了企业应用架构模式,您也可能会发现它有用。