アルバコン開発日記-Day 03


ソース:https://threedots.tech/post/basic-cqrs-in-go/
今、ボブおじさんのクリーニングアーキテクチャを読んで、クリーニングアーキテクチャでコードを書いています.

なぜUSECASEにCQRSモードを導入するのですか?

  • 最適化されたデータアーキテクチャ:読み出し側はクエリー最適化されたアーキテクチャを使用し、書き込み側は更新最適化されたアーキテクチャを使用する.
  • セキュリティ:正しいドメインエンティティのみがデータを書き込むことができることを確認します.
  • 問題分離:読み書きを区別することで、メンテナンス可能で柔軟なモデルを作成できます.複雑なビジネスロジックの多くは、書き込みモードに移行します.モデルの読み取りは比較的簡単です.
  • 単純クエリー:読み取りデータベースから特定のビューを保存およびクエリーする場合、アプリケーションは複雑な結合を回避できます.
  • システムは時間の経過とともに発展すると予想され、複数のバージョンのモデルが含まれる可能性がある.
  • Microsoft 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
    }
  • 登録会社CompanyHandler構造体はrepoという会社です.Repositoryと呼ばれるインタフェース変数があります.インタフェース変数なので、実行時にどのタイプを動的に決定します.これにより,ルブ変数の多形性を体現する.
  • New Register CompanyHandler関数は、実行時にパラメータとしてリポジトリインタフェースを受信し、処理プログラムを初期化する依存注入(DI:Dependency Injection)である.
  • Handle関数は、write modelの会社構造をパラメータとして受け入れ、ドメインモデルのNew company関数から会社オブジェクトを作成します.生成されたオブジェクトはインタフェースのrepoとして抽象化される.AddCompanyで保存またはエラーが発生しました.
  • 重要な点は,Handle関数の挙動は決定されたが,まだ実装されていないことである.本格的な実施は今後異なる層で行われる.Usecaseは動作のみを定義して実装しないため、実装部分が変更されても動作が変わらない場合は、Usecaseは変わらないままになります.