但我不清楚的是在哪里
工厂“层”位于 DDD
建筑学?工厂应该
直接调用仓库
获取其数据或服务
图书馆?
工厂应该是构建领域对象的一站式商店。需要执行此操作的代码的任何其他部分都应使用工厂。
通常,至少有三个数据源用作域对象构造的工厂的输入:来自 UI 的输入、来自持久性的查询结果和对域有意义的请求。因此,要回答您的具体问题,存储库将使用工厂。
这是一个例子。我在这里使用Holub's Builder pattern。 编辑:忽略此模式的使用。我已经开始意识到它doesn't mix too well with DDD factories。
// domain layer
class Order
{
private Integer ID;
private Customer owner;
private List<Product> ordered;
// can't be null, needs complicated rules to initialize
private Product featured;
// can't be null, needs complicated rules to initialize, not part of Order aggregate
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);
}
}
// domain layer
interface OrderEntryScreenExport { ... }
// UI
class UIScreen
{
public UIScreen(OrderEntryDTO dto) { ... }
}
// App Layer
class OrderEntryDTO implements OrderEntryScreenExport { ... }
这是 OrderFactory 的样子:
interface OrderFactory
{
Order createWith(Customer owner, Product ordered);
Order createFrom(OrderEntryScreenExport to);
Order createFrom(List<String> resultSets);
}
特色产品的逻辑和行程的生成都在 OrderFactory 中。
下面是工厂在每个实例中的使用方式。
在订单存储库中:
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
域。
另外,因为工厂是唯一的
允许创建对象的地方
你不会得到循环引用吗
如果你想创建你的对象
在您的数据和服务层中?
在我的示例中,所有依赖项都是从上到下流动的。我使用Dependency Inversion Principle(PDF 链接)来避免您所说的问题。
如果工厂类的角色是
对于对象创建,有什么好处
服务层有吗?
如果您的逻辑不适合任何单个域对象,或者您的算法涉及编排多个域对象,请使用服务。该服务将封装任何不适合其他任何事物的逻辑,并将其委托给适合的领域对象。
在我在这里草草写下的示例中,我想为订单制定行程将涉及多个域对象。 OrderFactory 可以委托给这样的服务。
顺便说一句,您描述的层次结构可能应该是 UI > App > Domain Services > Domain > Infrastructure (Data)
我问了很多问题
感谢任何回应。我是什么
缺少的是一个示例应用程序
演示如何在一个
领域驱动设计项目来了
在一起……有什么事情吗
那里?
Jimmy Nilsson 的Applying Domain Driven Design and Patterns 是对 Eric Evans 的Domain-Driven Design 的极大赞美。它有很多代码示例,虽然我不知道是否强调分层。分层可能很棘手,几乎是一个与 DDD 分开的主题。
在 Evans 的书中,有一个非常小的分层示例,您可能想看看。分层是一种企业模式,Martin Fowler 写了Patterns of Enterprise Application Architecture,您可能会发现它也很有用。