アルバコン開発日記-Day 03
ソース:https://threedots.tech/post/basic-cqrs-in-go/
今、ボブおじさんのクリーニングアーキテクチャを読んで、クリーニングアーキテクチャでコードを書いています.
最適化されたデータアーキテクチャ:読み出し側はクエリー最適化されたアーキテクチャを使用し、書き込み側は更新最適化されたアーキテクチャを使用する. セキュリティ:正しいドメインエンティティのみがデータを書き込むことができることを確認します. 問題分離:読み書きを区別することで、メンテナンス可能で柔軟なモデルを作成できます.複雑なビジネスロジックの多くは、書き込みモードに移行します.モデルの読み取りは比較的簡単です. 単純クエリー:読み取りデータベースから特定のビューを保存およびクエリーする場合、アプリケーションは複雑な結合を回避できます. システムは時間の経過とともに発展すると予想され、複数のバージョンのモデルが含まれる可能性がある. Microsoft CQRSドキュメントを参照してください.
-command/queryディレクトリを分割してCQRSモードに入れ、CQの使用例を含む.goを作成しました
モデルに分離し、そのデータモデルをUsecaseにマージします.
まだ何もしていないので、空の構造体です.
Commandのcompanyを登録するためにHandlerを作成します.commandはdomainに書き込まれたモデルではなくwriteに対応するモデルを作成して使用します.writeモデルを単独で使用する必要はありませんが、フィールドに露出する必要はありません.
モデルはまだ簡単なので、隠すことはありません.だから、domainの中のモデルをそのまま導入しました.
以降のデータ作成中に特定する必要のないフィールドがいくつかある場合は、異なります.
登録会社CompanyHandler構造体はrepoという会社です.Repositoryと呼ばれるインタフェース変数があります.インタフェース変数なので、実行時にどのタイプを動的に決定します.これにより,ルブ変数の多形性を体現する. New Register CompanyHandler関数は、実行時にパラメータとしてリポジトリインタフェースを受信し、処理プログラムを初期化する依存注入(DI:Dependency Injection)である. Handle関数は、write modelの会社構造をパラメータとして受け入れ、ドメインモデルのNew company関数から会社オブジェクトを作成します.生成されたオブジェクトはインタフェースのrepoとして抽象化される.AddCompanyで保存またはエラーが発生しました. 重要な点は,Handle関数の挙動は決定されたが,まだ実装されていないことである.本格的な実施は今後異なる層で行われる.Usecaseは動作のみを定義して実装しないため、実装部分が変更されても動作が変わらない場合は、Usecaseは変わらないままになります.
今、ボブおじさんのクリーニングアーキテクチャを読んで、クリーニングアーキテクチャでコードを書いています.
なぜUSECASEにCQRSモードを導入するのですか?
兼職コンソールの正式な実施
-command/queryディレクトリを分割してCQRSモードに入れ、CQの使用例を含む.goを作成しました
モデルに分離し、そのデータモデルをUsecaseにマージします.
まだ何もしていないので、空の構造体です.
Commandのcompanyを登録するためにHandlerを作成します.commandはdomainに書き込まれたモデルではなくwriteに対応するモデルを作成して使用します.writeモデルを単独で使用する必要はありませんが、フィールドに露出する必要はありません.
write_model.go
package command
type Company struct {
Name string
Address string
JobOpening bool
write専用モデルはドメイン内のモデルと同じでしょう?モデルはまだ簡単なので、隠すことはありません.だから、domainの中のモデルをそのまま導入しました.
以降のデータ作成中に特定する必要のないフィールドがいくつかある場合は、異なります.
register_company.go
package command
import (
"context"
"github.com/memoregoing/albacorn/company/domain/company"
)
type RegisterCompanyHandler struct {
repo company.Repository
}
func NewRegisterCompanyHandler (repo company.Repository) RegisterCompanyHandler {
if repo == nil {
panic("nil repo")
}
return RegisterCompanyHandler{repo: repo}
}
func (h RegisterCompanyHandler) Handle(ctx context.Context, cmd Company) (err error) {
co, err := company.NewCompany(cmd.Name, cmd.Address)
if err != nil {
return err
}
if err := h.repo.AddCompany(ctx, co); err != nil {
return err
}
return nil
}
Reference
この問題について(アルバコン開発日記-Day 03), 我々は、より多くの情報をここで見つけました https://velog.io/@memorego/알바콘-개발일기-Day-03テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol