我使用围绕DDD概念组织的域来处理标准Web应用程序.我想知道我的应用程序服务应该接受和返回什么样的对象.假设我有一个User
聚合应用服务.
1)DTO /简单类型(字符串,整数等)
public interface UserApplicationService {
void registerUser(UserDTO userDTO);
List<UserDTO> getUsersForOrganization(String organizationId);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,应用程序服务负责调用汇编程序将DTO转换为域对象,反之亦然.
这种方法的优点是我的应用程序服务是我的域对象的明确边界.另一个是应用服务是一个明确的事务边界.由持久性上下文管理的域对象不会在事务之外的某处泄漏.
缺点是在表格的情况下,验证必须基于DTO.所以我的验证规则在域(对象负责其状态)和DTO验证规则之间重复.(与Spring MVC示例应用程序的情况一样).此外,如果视图的某些部分需要另一种形式的模型(假设UserDTO没有足够的信息来呈现视图),我将需要创建另一个DTO并基于从应用程序服务返回的几个DTO,构成另一个,由视图使用.
2)域类型
public interface UserApplicationService {
void registerUser(User user);
List<User> getUsersForOrganization(OrganizationId organizationId);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,控制器/演示者负责转换.
最大的缺点是我的域对象从应用程序服务泄漏 - 没有明确的分离.另外,我们的交易边界在哪里?可能附加到的域对象(例如Hibernate会话)在应用程序服务层之外泄漏.(但是,我注意到这是编写了多少个示例应用程序.)
优点可能是控制器/演示者负责准备视图模型,因此它可以根据视图要求构成DTO.例如,视图可能需要一些未在DTO中从#getUsersForOrganizationMethod返回的其他信息.此外,验证可能基于域对象,因此在DTO和域对象之间不会重复.
3)域对象+门面
这是DDDsample应用程序中使用的第三个选项.应用程序服务返回域类型,但有一些外观负责转换.所以在我的情况下,控制器/演示者使用DTO与外观进行对话,外观进行转换,并使用域对象与应用程序服务进行对话.然而,在我的拙见中,它看起来有点压倒性 - 层数太多,样板代码太多.对于一个应用程序服务,它可能听起来很棒,但如果我们有几十个,我们需要有相同数量的外观方法 - 纯复制.此外,交易边界在哪里?
谁应该负责处理域名事件?应用服务,域服务或实体本身?
让我们用这个问题的简单例子.
假设我们在商店应用程序上工作,我们有一个专门用于订单操作的应用程序服务.在此应用程序中Order
是聚合根和遵循规则,我们只能在单个事务中使用一个聚合.下订单后,它将保留在数据库中.但还有更多工作要做.首先,我们需要更改清单中可用的项目数量,然后通知系统的其他部分(可能是另一个有界的上下文),应该启动该特定订单的运输程序.因为,如前所述,我们只能修改事务中的一个聚合,我认为发布OrderPlacedEvent
将由单独的事务中的某些组件处理.
问题出现了:哪些组件应该处理这类事件?
我有一个maven项目,其中包含围绕父pom组织的多个maven模块.所有这些模块都打包成JAR文件,这些文件是我Play的依赖项!作为SBT项目构建的应用程序:
MyProject
-> pom.xml (parent)
MavenModule1
-> pom.xml (child pom)
MavenModule2
-> pom.xml (child pom)
PlayApplication
-> Build.scala (SBT project)
Run Code Online (Sandbox Code Playgroud)
由于所有maven模块都是父模块(MyProject)的子项目,我可以转到'MyProject',执行mvn clean install
整个项目,除了PlayApplication之外.问题是如何修改父pom/SBT构建文件以与其余模块一起触发PlayApplication构建?
(我知道可能没有简单的,内置的方式来做到这一点,所以欢迎所有的黑客:))
我最近在一个教程中读到Spring在事务提交后关闭连接.
真的吗?我在Spring参考文档中找不到任何相关内容.
它背后的理由是什么?从现在开始,我认为连接和事务之间存在一对多的关系.
这里使用什么语言构造来创建Action实例?我认为在Scala中可以使用以下方法实例化一个类:
new Action(params)
apply()
伴随对象的调用方法(通常调用构造函数):Action(params)
但是在Scaladoc of Play中!操作见以下代码段:
val echo = Action { request =>
Ok("Got request [" + request + "]")
}
Run Code Online (Sandbox Code Playgroud)
什么叫这里?我知道我们创建了函数request => response
,但是这个函数在哪里传递?