2

引用元

注 - ここでは、サービスコンストラクターに渡す場合とメソッドに引数として渡す場合の両方に、「サービスをエンティティに注入する」という用語を使用しています。

a)ハンドラーと、ドメイン操作によってもトリガーされるが、代わりにドメイン内で処理されるアクション/操作の違いは何ですか? おそらく違いは、前者 (つまり、ハンドラー、またはより正確にはそのアクション) はドメインの概念を表していないのに対し、後者はドメインの概念を表しているということでしょうか?

b)

ドメイン エンティティに何も挿入する必要はありません。

ドメイン イベントを導入する理由は、ドメイン エンティティにサービスを注入する必要がないようにするためです。しかし、エンティティにドメイン サービスDSを注入することもあまり望ましくないため、そのような場合、ハンドラー(つまり、そのアクション) をドメインの概念にすることはできませんか (つまり、エンティティにDSを注入する代わりに、ハンドラーはこのDSを呼び出します)。

c) 実際にハンドラーがDSドメイン エンティティに挿入することも置き換えることができる場合、ハンドラーがDS自体を置き換えることができる状況もありますか?

d)

ハンドラー クラスはドメイン モデルに属しません。

ハンドラはインフラストラクチャ層に属しますか? DSを呼び出すハンドラについてはどうでしょうか。

アップデート:

a)

主な違いは、ドメイン イベント ハンドラーが事後に呼び出されることです。

しかし、操作OPによってトリガーされるアクション/操作 A (ハンドラー内ではなくドメイン内で処理するもの)は、事後 (つまり、OPが終了した後) にも発生する可能性があります。したがって、これらの主な違いについて議論することはできません。2 種類のアクションは、Aがドメインの概念を表しているのに対し、ハンドラーによって実行されるアクションはドメインの概念を表していないということです。

b) 念のために言っておきますが、私の最初の質問に対する答えは、場合によってはエンティティがDSを呼び出す代わりに、ハンドラーに適切なDSを呼び出させることができるということでしょうか?

c)

ドメイン イベントは、上記のような場合にドメイン サービスの必要性をなくすことができます

したがって、 c)に対する答えは、場合によってはハンドラーが実際にDSを置き換えることができるということですか? しかし、もしそうなら、そのような場合、ハンドラー(つまり、そのアクション) はドメインの概念であると主張できませんか?

d)

ハンドラーは、適切なインフラストラクチャ サービスまたはドメイン サービスに委任するだけなので、実際にはドメインの一部ではありません。これらは、アプリケーション サービスに似た単なる接着剤の一種です。これらは引き続きドメイン プロジェクトで宣言できますが、通常はその必要はありません。

私。

ハンドラーは、適切なインフラストラクチャ サービスまたはドメイン サービスに委任するだけなので、実際にはドメインの一部ではありません。

念のために言っておきますが、「委任先」とは、エンティティが適切なDSまたはインフラストラクチャ サービスを呼び出す代わりに、特定のサービスを呼び出すジョブをハンドラに委任することを意味していると思いますか?

Ⅱ.

これらは引き続きドメイン プロジェクトで宣言できますが、通常はその必要はありません。

c)で述べたように、場合によってはハンドラーがDS自体を置き換えることができます (つまり、ハンドラーはDSを呼び出しませんが、実際には必要な操作を自分で実行します)。そのような場合、ハンドラードメインの概念であり、ドメイン層に属していると主張できませんか?!

2 番目の更新:

D - Ⅱ

c) で述べたように、場合によってはハンドラーが DS 自体を置き換えることができます (つまり、ハンドラーは DS を呼び出しませんが、実際には必要な操作を自分で実行します)。そのような場合、ハンドラーはドメインの概念であり、ドメイン層に属していると主張できませんか?!

このような場合、ハンドラーには 2 つの役割があります。イベントの接続と操作の実行です。配線部分はドメインの概念ではありませんが、操作自体はドメインの概念です。

a) その場合、ハンドラーは SRP に違反していることになりますか?

b)

配線部分はドメインの概念ではありませんが、操作自体はドメインの概念です。

このような場合、ハンドラーをドメイン層に配置する必要がありますか?

2)アクション Aがを返すと仮定すると、注入によってAを実行する方が良いかどうかをどのように判断しますか(注 - ここでは、サービスコンストラクターに渡すか、それをメソッドへの引数)サービスS (次に A を実行する) をエンティティに変換するか、代わりにドメイン イベントを使用するか(これにより、 Sでメソッドを呼び出す)?

おそらく決定は、一部のドメインコードがさらに処理するためにAの結果を必要とするかどうかに依存しますか?

4

1 に答える 1

6

a) 主な違いは、ドメイン イベント ハンドラーが事後に呼び出されることです。イベントは既に発生しており、不変です。したがって、ハンドルされたものは、すでに起こったことに対応することしかできません。さらに、ハンドラーは、電子メールの送信など、ソース エンティティの責任の一部ではない動作を引き起こす可能性があります。

b) ドメイン イベントは、より高度なカプセル化とデカップリングを保証するためのパターンです。たとえば、何らかのアクションの後に電子メールを送信する必要があるという事実は、いくつかの方法で実装できます。1 つの方法は、電子メール サービスをエンティティに渡すことです。その後、エンティティは必要に応じて電子メール サービスを呼び出します。もう 1 つの方法は、呼び出し元のアプリケーション サービスで電子メール サービスを呼び出すことです。最初のアプローチの問題は、エンティティが電子メール サービスに結合され、SRP に違反していることです。つまり、ドメインが技術的な問題に対処しているのです。2 番目のアプローチの問題点は、電子メールをいつ送信するかをアプリケーション サービスに通知する責任が生じることです。ドメイン イベントは、エンティティがイベントの発生時期を決定し、ハンドラーがイベントの処理方法を決定するため、これらの問題の両方に対処します。

c) ドメイン イベントは、上記のような場合にドメイン サービスの必要性をなくすことができますが、すべての場合にドメイン サービスの必要性をなくすわけではありません。そもそも動作を呼び出すためにエンティティがドメイン サービスを必要とする場合があります。ドメイン イベントは事後のシナリオにしか対処できないため、これは役に立ちません。

d) ハンドラーは、適切なインフラストラクチャ サービスまたはドメイン サービスに委任するだけなので、実際にはドメインの一部ではありません。これらは、アプリケーション サービスに似た単なる接着剤の一種です。これらは引き続きドメイン プロジェクトで宣言できますが、通常はその必要はありません。

アップデート

a) 常にそうであるとは限りません。ドメイン イベント ハンドラーが別のドメイン操作を呼び出すことは許容されます。これは、単一プロセス内でイベント駆動型アーキテクチャを実行する方法です。

b) はい、ドメイン イベント ハンドラはドメイン サービスを呼び出すことができます。イベントに応答してハンドラーがドメイン サービスを呼び出すようにすることは、分離された方法 (オブザーバー パターンの形式) でエンティティに動作を追加する方法です。

c) 通常、ハンドラーはドメイン操作を実行するために何かに委任します。ハンドラー自体は単なる接着剤です。ただし、ドメイン ロジックをハンドラーに配置することもできます。その場合、ドメイン サービスのように動作します。

d1) はい。ハンドラーは、一部のサービスにコンストラクターが依存する単純なクラスになります。イベントを処理するとき、そのサービスで適切なメソッドを呼び出します。

d2) そのような場合、ハンドラーには 2 つの責任があると言えます。イベントの接続と操作の実行です。配線部分はドメインの概念ではありませんが、操作自体はドメインの概念です。

更新 2

a) はい、そう思います。ドメイン イベントがどのように実装されているかによって、ハンドラーは単なるラムダになる可能性があります。クラスである必要はありません。

b) ハンドラーがドメイン サービスに委任している場合は、ドメイン層に入ることができます。インフラストラクチャ サービスを利用する場合は、インフラストラクチャ レイヤーに入る必要がある場合があります。また、a) で述べたように、ハンドラーはクラスである必要はなく、ラムダでもかまいません。

2) ドメイン イベントとは、ドメイン内で起こった注目すべきことです。サブスクライバーがそのイベントに関心を持っていることを想定できるドメイン イベントを使用します。このイベントを使用して、ドメイン内の追加の動作を呼び出したり、外部に発行したりできます。主な観察は、それが過去時制の不変の出来事であるということです。

おそらく決定は、一部のドメインコードがさらに処理するために A の結果を必要とするかどうかに依存するのでしょうか?

これは本当です。ドメイン操作がその動作を実行し続けるためにドメイン サービス S の結果を必要とする場合、そのサービスをその動作メソッドに渡す必要があります。エンティティは、公開されたドメイン イベントの処理の結果を受け取ることができません。

于 2013-02-13T18:35:41.430 に答える