2012-06-19 21 views
7

明確なドメインモデルを持つ比較的新しいWebベースのアプリケーションを、より多くのCQRSスタイルシステムに変換しようと考えています。私の新しいアプリケーションは、本質的に古い既存のシステムの強化された置き換えです。レガシーシステムでのCQRS

私の組織内の既存のシステムは、企業全体のサイロに存在する無数のアプリケーション(カオスメソッドを使用して開発された)によって更新される一連の共通データベースを共有します。 (会社の誰もそれを識別することはできません。)

私の質問は私のアプリケーションの読み込みモデルに関するものです。さまざまなステータスの変更、一般的なユーザーデータなどは私のコントロール外の他のアプリケーションによって更新されるので、読み込んだモデルをビルドして外部の更新を処理できるようにするにはどうすればよいですか?

私がこれまでに以下と考えてきました:

  1. は、すべてのテーブルを読んで読み取りモデルのデータベース内のビュー、レガシーと新しい
  2. を作成して新たなリードモデルのテーブルを更新するために、既存のテーブルにトリガを追加します。
  3. 希望
を放棄読み出しモデル
  • ための外部データストアを更新するためにデータベース(CLRストアドプロシージャの/ etc [SQLサーバー])にコードを追加

    これにアプローチする方法に関する一般的な合意は何ですか?すべてを一から書き直すことなく、私がレガシーシステムに秩序をもたらすことができると思うのは愚かですか?

  • 答えて

    1

    私は成功のためにオプション#1を使用しました。書込みデータベースの複雑さに応じて、読取りモデルを作成するためにデータを浪費するビューを作成することは実行可能な選択肢です。意味は、ほとんどの開発者が理解できる比較的単純な結合であれば、私はそれがあなたのために実行可能かどうかを見るために詳しく見ていきます。私は、これらの見解が複雑すぎることに注意しています。

    従来のレポートデータベースと同様に、定期的にポーリングを作成して更新することも検討してください。通知と比較して最適ではありませんが、読み取りモデルがどれほど古くなっているかによっては、これも見ることができます。

    1

    私はかつて同じような状況にあった、次の手順では、私はそれをやった方法だったが:

    レガシーシステムを改善し、クリーンなコードベースを達成するために、キーは、書き込みの責任を引き継ぐことです。しかし、最終的な展開を危険にさらすインタフェース/契約の変更を導入する可能性があるので、あまり野心的ではない。

    1. すべての書き込みが直接SQLの更新を除いて実行される場合は、できるだけ下位互換性を保つようにしてください。新しく開発されたコマンドハンドラのアダプタ/クライアントとしてそれらを持って行きます。

    2. 書き込みの一部は直接SQLアップデートですが、あなたのコントロールから外されています
      新しいインターフェース/契約に変更できるかどうかチームに問い合わせてください。
      ノーならば、彼らは最終的な一貫性を許容し、データベースプロシージャとSQLの更新プログラムが置き換えられることを喜んでいることができるかどうか、ステップ3

    3. が掲載参照してください?
      はいの場合は、すべてのSQLアップデートをプロシージャに配置してデプロイメントをスケジュールし、手順4を参照してください。
      もしそうでない場合は、リファクタリングに含める必要があります。

    4. プロシージャを変更して、SQLアップデートをイベントを挿入するものに置き換えます。また、イベントを巻き込んで公開するバックエンドジョブを開発します。新しいアプリケーションでこれらのイベントを購読させ、コマンドハンドラにコマンドを発行させます。

    5. コマンドハンドラからイベントを送信し、他のアプリケーションが使用していたテーブルを更新するために使用します。

    6. レガシーシステムの次の部分に移動します。

    関連する問題