こちらの質問回答への続きです

10月08日

質問者さん

はい、おっしゃる通りでリクエストヘッダーにCookieを載せた状態でのリクエストが求められる状況です もう少しシステム間の連携部分を詳細に説明すると、 システムA: 開発対象 システムB: 依存している外部サービス システムAに認証Cookieをリクエストヘッダーに付与してリクエスト その後システムAがリポジトリを使って集約を取得 この時リポジトリの実装では、システムAのコントローラーが受け取った認証CookieをそのままシステムBのリクエストヘッダーに付与してリクエスト(この部分が制約) となります システムAもBも /me エンドポイントに認証 Cookie を付与した状態で get リクエストを投げる必要があるイメージです

10月10日

松岡@ログラス/DDD,アジャイル

松岡@ログラス/DDD,アジャイルさん

なるほど。だとすると ①まず外部サービスを呼び出すものはリポジトリではなくXxxServiceClientといった形のインターフェイスをドメイン層に定義するのが良いと思います。リポジトリは集約単位で基本的にはデータベースからデータを出し入れするものになりますが、実際のところはトランザクションを意識する必要がある場合が多いと思います。その際、トランザクションが効く内部の処理と、トランザクションが効かない外部の処理をリポジトリという同じ見せ方にしてしまうと、ロールバックが必要な際に部分的にロールバックが効かないといった事故のリスクになります。また、今回問題の違和感の通り、渡すべき値の性質が異なるものになるので、リポジトリとは別の種類のインターフェイスとして定義した方がよいと思います。 一般的に技術的な裏側は隠蔽したくなりますが、それはインターフェイスを利用する側が隠蔽されている内容について関心を持たなくて良い場合です。トランザクションやCookieを渡すなど利用元が意識せざるを得ないものがある場合は、それを隠蔽しない方が良いと思います。 ②Cookieの値はそのサービス呼び出しのためのパラメーター型をドメイン層に定義しましょう。 リクエストのCookie型を呼び出しパラメータークラスに詰め替え、XxxServiceインフラ層の実装クラスの中で改めてCookieに詰め替えてリクエストします。 なお、XxxServiceClientにどの抽象度で名前をつけるかはこれもまた呼び出し元がどこまで意識すべきかによって変わります。 例えば支払いの外部サービスに通信する場合、ですが「支払いをするサービス」という意識だけでよければPaymentServiceClientとなり、画面から支払いサービスを選択するなど明確な意識があるなどの場合はStripeClientなどと具体的な名前にしてもよいでしょう。

松岡@ログラス/DDD,アジャイルさんに 質問してみましょう!

松岡@ログラス/DDD,アジャイル

松岡@ログラス/DDD,アジャイル

DDDや設計にお困りの方はDMにてご相談ください。講義、モブモデリングやコーディングなどご要望に合わせた進め方でサポートします(オンライン)。 YouTube: https://www.youtube.com/channel/UCbHtbIUxtfGjrDy1WcqxExw

関連する質問

10月10日

続き質問

ご回答ありがとうございます Twitterの方でも他の方が被せてくださった説明も合わせて拝見しました 「Cookieは技術的関心ごとだからインフラ層に閉じ込める」という考えに固執しすぎていたこと、またリポジトリに対する理解も深まり、具体的な実装イメージも付き非常に助かりました 追加の質問ではないですがこの場を借りてお礼を申し上げます

10月08日

続き質問

ご回答ありがとうございます 通常であればご回答のようにCookieからUserIdに詰め替えてリポジトリを呼び出すことについては理解しているのですが、本件の質問内容としては、リポジトリで呼び出される外部システムのAPIの制約として、「UserIdを使わずにCookieをリクエストに乗せること」が制約条件にある場合、どのような手段が取れるか、といった趣旨となります

松岡@ログラス/DDD,アジャイルさんが

最近答えた質問

12月12日

2つのドメインオブジェクトをまたがるロジックがあった時にドメインサービスを利用するというのが慣例かと思いますが、どちらか片方のドメインオブジェクトにメソッドを作成し、引数でもう片方のオブジェクトを受け取るというのは今後の機能性や保守性を高めずらくなってしまいますでしょうか?ご確認よろしくお願いいたします。

12月12日

イベントストーミングによるモデリングを実装に反映する際に、コマンドやポリシーなどもドメインとして実装するべきでしょうか? システム外部で発生したイベントは、プレゼンテーション層が購読してアプリケーション層へ処理を依頼するという認識なのですが、システム内部で発生したイベントをどのような流れで処理をさせるかに迷っています。 システム内のイベントの処理の場合、アプリケーション層でイベントパブリッシャーにイベントを発行した後、イベントサブスクライバーを実装したポリシーがキャッチし、コマンドを実行するという流れを考えているのですが、この時にコマンドやポリシーもドメイン層にあったほうがドメインの関心ごととして適切なのではないか、と考えています。 このような認識でも問題なさそうか、またそもそも認識違いをしているかについてご教授いただけると助かります。

12月12日

親子のテーブル関係をそのままドメインモデル化したときに、子テーブルのモデルは親テーブルにインスタンスで管理されています。子テーブルは識別子を持たなくても不都合がありません。さらに、イミュータブルクラスとして設計しています。この場合、子テーブルのモデルはまるっと、値オブジェクトとなりえますが、そのような設計は、「おすすめ」といった観点でいかがでしょうか?