小编hop*_*sey的帖子

DDD,PHP.域对象和业务逻辑

我最近一直忙于尝试理解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().我们在这里运行其他域对象.

也许我们应该只使用域对象来表示数据,但是使用一些装饰器来执行更高级的任务?

提前致谢.

php domain-driven-design model domain-object

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

无法反序列化“java.time.Instant”类型的值 - jackson

上这样的课

@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

java json jackson spring-boot

7
推荐指数
2
解决办法
2万
查看次数

DDD、PHP - 在哪里执行验证?

我最近开始玩 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 岁的用户拥有自己的电子邮件地址,该怎么办?我们必须检查今天的年龄,如果不正常则抛出异常。

我应该把它放在哪里?

  • 实体 - 在构造函数中创建用户实体时检查它?
  • 命令 - 在执行插入/更新/任何命令时检查它?我在我的项目中使用战术家,所以它应该是一份工作 …

php validation domain-driven-design model domain-object

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

mat-error用于单独的组件无法正确呈现

我想使用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标签中并且没有正确显示(即使没有错误,它们也不会始终显示和显示)

有没有什么方法角度可以渲染组件没有父标签?或者您有任何想法如何使其正常工作?提前致谢.

angular-material angular-material2 angular

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

将字节内容存储在S3中

我需要将二进制 ( byte[]) 内容(PDF 文件)保存到 S3。

我不想在 HDD 中存在硬拷贝,pdf 正在动态生成,然后需要将其发送到 S3。

Java AWS SDKAmazonS3.putObject()需要File输入方法签名,如何直接传递二进制内容而不将其保存到硬盘驱动器?

java amazon-s3 amazon-web-services spring-boot

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

如何使用IN运算符查询jsonb数组

我正在寻找一种在数组中使用“ 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运算符可以吗?

postgresql json jsonb

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

MongoDB 嵌套 $group 和 sum

我是 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)

mapreduce mongodb mongodb-query aggregation-framework

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