小编woo*_*oof的帖子

应用程序服务参数/返回类型

我使用围绕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与外观进行对话,外观进行转换,并使用域对象与应用程序服务进行对话.然而,在我的拙见中,它看起来有点压倒性 - 层数太多,样板代码太多.对于一个应用程序服务,它可能听起来很棒,但如果我们有几十个,我们需要有相同数量的外观方法 - 纯复制.此外,交易边界在哪里?

domain-driven-design

14
推荐指数
1
解决办法
2483
查看次数

在DDD中,谁应该负责处理域事件?

谁应该负责处理域名事件?应用服务,域服务或实体本身?

让我们用这个问题的简单例子.

假设我们在商店应用程序上工作,我们有一个专门用于订单操作的应用程序服务.在此应用程序中Order是聚合根和遵循规则,我们只能在单个事务中使用一个聚合.下订单后,它将保留在数据库中.但还有更多工作要做.首先,我们需要更改清单中可用的项目数量,然后通知系统的其他部分(可能是另一个有界的上下文),应该启动该特定订单的运输程序.因为,如前所述,我们只能修改事务中的一个聚合,我认为发布OrderPlacedEvent将由单独的事务中的某些组件处理.

问题出现了:哪些组件应该处理这类事件?

events domain-driven-design

9
推荐指数
1
解决办法
2929
查看次数

将sbt(play!)项目与maven父pom集成

我有一个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构建?

(我知道可能没有简单的,内置的方式来做到这一点,所以欢迎所有的黑客:))

build maven sbt playframework-2.1

8
推荐指数
1
解决办法
3858
查看次数

提交事务后Spring是否会关闭连接?

我最近在一个教程中读到Spring在事务提交后关闭连接.

真的吗?我在Spring参考文档中找不到任何相关内容.

它背后的理由是什么?从现在开始,我认为连接和事务之间存在一对多的关系.

spring transactions spring-transactions

5
推荐指数
1
解决办法
6646
查看次数

Play的实例化!行动 - 那是什么语言结构?

这里使用什么语言构造来创建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,但是这个函数在哪里传递?

scala

1
推荐指数
1
解决办法
145
查看次数