- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不清楚工厂类的角色和职责是什么。我知道工厂类应该负责创建域对象(聚合根)及其关联的实体和值对象。
但是我不清楚 DDD 架构的工厂“层”在哪里?工厂应该直接调用存储库来获取其数据还是服务库?
工厂在以下框架中的位置:
UI > 应用程序 > 域 > 服务 > 数据
此外,由于工厂是唯一允许创建对象的地方,如果您想在数据和服务层中创建对象,您不会得到循环引用吗?
如果工厂类的作用是创建对象,那么服务层有什么好处?
我问了很多问题,感谢您的回复。我缺少的是一个示例应用程序,它演示了域驱动设计项目中的所有层如何组合在一起......有什么东西吗?
最佳答案
But what is not clear to me is where the factory "layer" lies with a DDD architecture? Should the factory be calling directly into the repository to get its data or the service library?
工厂应该是构建域对象的一站式商店。需要执行此操作的代码的任何其他部分都应该使用工厂。
通常,至少有三个数据源用作域对象构建工厂的输入:来自 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());
Where does the factory fit into the following framework: UI > App > Domain > Service > Data
域名。
Also, because the factory is the only place allowed for object creation would'nt you get circular references if you wanted to create your objects in your data and service layers?
在我的示例中,所有依赖项都是从上到下流动的。我用了Dependency Inversion Principle (PDF链接)以避免您所说的问题。
If the role of the factory class is for object creation then what benefits does the service layer have?
当您的逻辑不适合任何单个域对象,或者您的算法涉及编排多个域对象时,请使用服务。该服务将封装任何不适合其他任何内容的逻辑,并将其委托(delegate)给适合的域对象。
在我在这里潦草写下的示例中,我想为订单制定行程将涉及多个域对象。 OrderFactory 可以委托(delegate)给这样的服务。
顺便说一句,您描述的层次结构可能应该是 UI > 应用程序 > 域服务 > 域 > 基础设施(数据)
I've asked a lot of questions and appreciate any response. What i'am lacking is a sample application which demonstrates how all the layers in a domain driven design project come together...Is there anything out there?
Applying Domain Driven Design and Patterns Jimmy Nilsson 的作者是对 Eric Evans 的 Domain-Driven Design 的极大赞美。它有很多代码示例,但我不知道是否强调分层。分层可能很棘手,并且几乎是一个独立于 DDD 的主题。
在埃文斯的书中,有一个非常小的分层示例,您可能想查看一下。分层是一种企业模式,Martin Fowler 写道 Patterns of Enterprise Application Architecture ,您可能会发现它也很有用。
关于design-patterns - 领域驱动设计和工厂类的作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/555241/
我应该执行以下操作: 可能通过服务/工厂,使用 $q(异步)查询 API 以获取大型名称数据集 有另一个服务(也是异步的),它应该只返回上述工厂的元素,如果它们与某个字符串(搜索字段)匹配。目的是缩小
我有一个通用的基类。我有一个实现基类的具体类。 我将如何创建工厂类/方法来交付不同类型的具体类? 举个例子: public class ReceiverBase where T : IInte
我正在查看以下链接中的 Ninject Factory 扩展: http://www.planetgeek.ch/2011/12/31/ninject-extensions-factory-intro
工厂、提供商和服务这三个术语之间有什么区别? 刚刚了解 NHibernate 及其存储库模式(POCO 类等)。 最佳答案 工厂:通过将一堆位组合在一起或基于某种上下文选择类型来组装类 Provide
使用CGLIB我可以做到 final var enhancer = new Enhancer(); enhancer.setUseCache(false); enhancer.setSuperclas
我试图在 Kotlin 中使用伴随对象工厂方法(相当于 Java 中的静态工厂方法)创建一个嵌套内部类。这是我的代码的简化版本。 class OuterClass { var myData:L
我正在为我的大学做一个项目,但遇到了问题。 基本上,该项目由一个客户端-服务器应用程序组成,我想创建一个用于通信的 Packet 类。数据包由 header 和主体组成。现在问题来了。我可以有一些不同
这个问题在这里已经有了答案: Why doesn't polymorphism work without pointers/references? (6 个答案) What is object sl
我正在制作一个套接字工厂。我希望每个外部应用程序都使用 Socket 类的接口(interface),它是几个类(ServerSocketTCP、ClientSocketTCP、ServerSocke
我是 angularjs 的新手,我正在尝试创建一个小型电影数据库。这是我第一次使用工厂,我想确保这是正确的方法,以及如何在另一个功能中使用这个工厂,如下所示? 我希望这个工厂只运行一次,这样我就可以
这个问题在这里已经有了答案: Java inner class and static nested class (28 个答案) 关闭 5 年前。 public class DataFactory
我看过很多关于 C++ 工厂的帖子,但到目前为止我还没有看到解决我的问题的解决方案。 (虽然我可能遗漏了一些东西。) 示例控制台应用程序: #include #include #include
这是一个简单的 C++ 项目,有 2 种设计模式:单例和工厂,sigleton 也是一个模板化类,一个接口(interface) (IHash) 和一个类 (Hash1)。一个简单的工厂类 (Hash
这个问题类似于Factory and generics ,并且可能有相同的答案,但它是不同的。我有一个通用基类,它将由完全独立的 JAR 中的类进行扩展。所述 JAR 应该能够在不更改任何其他代码的情
问题是我需要为传递的类创建一个新实例 有没有办法重写这个函数,让它可以接受任意数量的参数? function createInstance(ofClass, arg1, arg2, arg3, ...
我想用简单的 C++ 语法创建一个简单的工厂方法: void *createObject(const char *str,...) { if(!strcmp("X",str)) retu
经过大约 10 个月的程序化 PHP 学习后,我现在正尝试着手研究基本的 OOP 原则和设计模式。这是一个爱好,我没有那么多时间去追求它,所以请原谅这个问题的水平很低。 我的网站(目前 100% 程序
我有一个简单的问题。 我如何编写一个工厂来定义使用 make() 或 create() 的关系,具体取决于原始调用 make() 还是 create()? 这是我的用例: 我有一个简单的工厂 /**
我正在尝试在延迟加载模块中提供 APP_BASE_HREF 注入(inject) token ,然而,工厂方法根本没有被调用。 在这里https://github.com/MaurizioCascia
我有以下 ast: import { factory as f } from 'typescript' const typeDeclaration = f.createTypeAliasDeclara
我是一名优秀的程序员,十分优秀!