我最近一直忙于尝试理解ddd和Model层的概念.阅读大量的文章,例子,Q和A,花了很多时间.而且我仍然不确定我是否有正确的原则.
其中之一就是问题的答案:Domain Objects中应该存在多少业务逻辑?有些消息来源说Domain Objects应该附带整个业务逻辑,另一方面,我遇到了一些文章,我认为它应该尽可能小,只代表它的价值.这让我很困惑.
在我的理解中,域对象是表示域中实体的类.
因此,举例来说,请使用Invoice实体.每张发票都包含其项目.要计算发票金额,我们必须对所有项目值进行求和(这是非常简单的示例,在现实世界中会出现添加税,计算付费价值等情况)
class Invoice
{
public $id;
public $items = [];
public $status;
const STATUS_PAID = 'paid';
const STATUS_NOT_PAID = 'not_paid';
public function isPaid()
{
return $this->status == self::STATUS_PAID;
}
public function getInvoiceValue()
{
$sum = 0;
foreach($this->items as $item) {
$sum += $item->value;
}
return $sum;
}
}
Run Code Online (Sandbox Code Playgroud)
在我的理解中,方法isPaid()是在正确的位置.它指的是自己的数据.但我不确定getInvoiceValue().我们在这里运行其他域对象.
也许我们应该只使用域对象来表示数据,但是使用一些装饰器来执行更高级的任务?
提前致谢.
上这样的课
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public final class ActiveRecoveryProcess {
private UUID recoveryId;
private Instant startedAt;
}
Run Code Online (Sandbox Code Playgroud)
我收到com.fasterxml.jackson.databind.exc.InvalidFormatException消息Cannot deserialize value of typejava.time.Instantfrom String "2020-02-22T16:37:23": Failed to deserialize java.time.Instant: (java.time.format.DateTimeParseException) Text '2020-02-22T16:37:23' could not be parsed at index 19
JSON 输入
{"startedAt": "2020-02-22T16:37:23", "recoveryId": "6f6ee3e5-51c7-496a-b845-1c647a64021e"}
Run Code Online (Sandbox Code Playgroud)
杰克逊配置
@Autowired
void configureObjectMapper(final ObjectMapper mapper) {
mapper.registerModule(new ParameterNamesModule())
.registerModule(new Jdk8Module())
.registerModule(new JavaTimeModule());
mapper.findAndRegisterModules();
}
Run Code Online (Sandbox Code Playgroud)
编辑
JSON是从postgres生成的
jsonb_build_object(
'recoveryId', r.recovery_id,
'startedAt', r.started_at
)
Run Code Online (Sandbox Code Playgroud)
时间戳在哪里r.started_at。
我最近开始玩 DDD。今天我在我的应用程序中放置验证逻辑时遇到问题。我不确定我应该选择哪一层。我在互联网上搜索,找不到解决我问题的统一解决方案。
让我们考虑以下示例。用户实体由值对象表示,例如 id (UUID)、年龄和电子邮件地址。
final class User
{
/**
* @var \UserId
*/
private $userId;
/**
* @var \DateTimeImmutable
*/
private $dateOfBirth;
/**
* @var \EmailAddress
*/
private $emailAddress;
/**
* User constructor.
* @param UserId $userId
* @param DateTimeImmutable $dateOfBirth
* @param EmailAddress $emailAddress
*/
public function __construct(UserId $userId, DateTimeImmutable $dateOfBirth, EmailAddress $emailAddress)
{
$this->userId = $userId;
$this->dateOfBirth = $dateOfBirth;
$this->emailAddress = $emailAddress;
}
}
Run Code Online (Sandbox Code Playgroud)
与业务逻辑无关的验证由 ValueObjects 执行。没关系。我在放置业务逻辑规则验证时遇到了麻烦。
假设,如果我们需要让年满 18 岁的用户拥有自己的电子邮件地址,该怎么办?我们必须检查今天的年龄,如果不正常则抛出异常。
我应该把它放在哪里?
我想使用mat-errors在我的Angular 5 SPA中呈现服务器端错误.
这是我到目前为止所做的,它的确有效
<mat-form-field class="col-6">
<input matInput formControlName="firstName">
<mat-error [hidden]="!form.controls.firstName.hasError('required')">This field is required and cannot be empty</mat-error>
<mat-error [hidden]="!form.controls.firstName.hasError('other')">Some other error</mat-error>
</mat-form-field>
Run Code Online (Sandbox Code Playgroud)
表单的每个字段看起来都很相似.输入字段和下面的许多mat-error标记.单个输入字段附加了大量重复代码.此外,添加新的错误消息会导致在需要它的每个字段中添加它.我认为这是一个很好的空间来引入管理错误消息的组件,并注入表单控件它决定显示哪个错误(我希望所有字段都有常见的错误消息).
所以我想这样做
<mat-form-field class="col-6">
<input matInput formControlName="firstName">
<app-mat-errors [field]="form.controls.firstName"></app-map-errors>
</mat-form-field>
Run Code Online (Sandbox Code Playgroud)
并且在app-mat-errors组件模板中包含mat-error我们曾经在每个字段中拥有的所有代码
<mat-error [hidden]="!field.hasError('required')">This field is required and cannot be empty</mat-error>
<mat-error [hidden]="!field.hasError('other')">Some other error</mat-error>
etc....
Run Code Online (Sandbox Code Playgroud)
使用这种方法,我遇到了正确渲染组件的问题.
当放入时<app-mat-errors>,<mat-error>标签嵌入app-mat-errors标签中并且没有正确显示(即使没有错误,它们也不会始终显示和显示)
有没有什么方法角度可以渲染组件没有父标签?或者您有任何想法如何使其正常工作?提前致谢.
我需要将二进制 ( byte[]) 内容(PDF 文件)保存到 S3。
我不想在 HDD 中存在硬拷贝,pdf 正在动态生成,然后需要将其发送到 S3。
Java AWS SDKAmazonS3.putObject()需要File输入方法签名,如何直接传递二进制内容而不将其保存到硬盘驱动器?
我正在寻找一种在数组中使用“ IN”子句查询postgres jsonb字段的方法。
假设我有一张桌子
CREATE TABLE test(
id uuid,
test_content jsonb,
PRIMARY KEY(id)
);
INSERT INTO test (id, test_content) VALUES
('aa82a8b8-33ef-4937-bd8c-8a4b40960f18', '[{"label":"a","label1":"1"},{"label":"b","label1":"2"}]'),
('ba82a8b8-33ef-4937-bd8c-8a4b40960f18', '[{"label":"c","label1":"3"}]'),
('da82a8b8-33ef-4937-bd8c-8a4b40960f18', '[{"label":"d","label1":"4"}]');
Run Code Online (Sandbox Code Playgroud)
我需要选择test_content数组中的label可能为b或的行d。
我试过了
SELECT *
FROM test
WHERE test_content @> '[{"label":"b"}]' OR test_content @> '[{"label":"d"}]'
Run Code Online (Sandbox Code Playgroud)
但是当我想用label1包含扩展查询时,2还是3变得复杂...
我需要的是 WHERE label IN ('b','d') AND label1 IN ('2','3')
jsonb运算符可以吗?
我是 MongoDB 的新手,所以如果我错过了文档中的某些内容,请原谅我。我有一个这样的收藏
[date: "2015-12-01", status: "resolved", parentId: 1]
[date: "2015-12-01", status: "resolved", parentId: 2]
[date: "2015-12-01", status: "resolved", parentId: 2]
[date: "2015-12-01", status: "waiting", parentId: 2]
[date: "2015-12-02", status: "resolved", parentId: 1]
[date: "2015-12-02", status: "waiting", parentId: 2]
[date: "2015-12-02", status: "waiting", parentId: 2]
[date: "2015-12-03", status: "resolved", parentId: 1]
Run Code Online (Sandbox Code Playgroud)
我期望对按以下分组的输出求和
日期 -> 父 ID -> 状态
所以那就是
{
"2015-12-01": {
"1": {
"resolved": 1
},
"2": {
"resolved": 2,
"waiting": 1
}
}
"2015-12-02": {
"1": {
"resolved": …Run Code Online (Sandbox Code Playgroud) java ×2
json ×2
model ×2
php ×2
spring-boot ×2
amazon-s3 ×1
angular ×1
jackson ×1
jsonb ×1
mapreduce ×1
mongodb ×1
postgresql ×1
validation ×1