Mitsuyuki.Shiibaスマートフォン用の表示で見るMitsuyuki.Shiiba2015-06-25実践DDDのサンプルプロジェクトが学びしかないDDDIDDDを読んで、それなりに書いてあることは分かり始めたかな。いざサンプルプロジェクトを読んでみたら、全然そんなことなかった。github.comいつものように、自分メモ。全部で3プロジェクトと1ライブラリがある。iddd_agilepmデータストアとしてKVS(LevelDB)を使用。DIコンテナは使ってない。ORM使わずにやってみた。Sourcedな書き込みモデルと、CQRSの読み込みモデルを1スレッドで実行してる。イベントジャーナルとしてLevelDBを、リードモデル用にMySQLを使ってるのでほんのちょっとだけ一貫性がない状態が発生する可能性がある。別々のデータストアを使って、でも、できるだけ一貫性が保てるようにしてみた。iddd_identityaccessORM(Hibernate)使用。RESTfulインターフェイスを提供。RESTとRabbitMQでドメインイベント通知を発行できる。iddd_common共通のコードを保持。このやり方は推奨はしないけど、サンプル用には別にいいかな。テストDockerで環境構築してgradleでテスト実行できるよ。プロジェクトまとめデータ周りLevelDB、MySQLORM使ってたり、JDBCでMySQLにアクセスしてたり、KVSからエンティティ読み込んだりしてる。コンテナDI使ってるのと、使わずにやってるのがある。アーキテクチャイベントソーシング、CQRS、イベントストアドメインイベントRESTとRabbitMQiddd_agilepmを読むパッケージングがこんな感じ。port/adapterはヘキサゴナルアーキテクチャか。applicationdomain/modelport/adapterapplicationパッケージサブパッケージサービス単位でサブパッケージが切られてるっぽい。その中にサービスクラスが一つと、各メソッド用のコマンドクラスが複数ある。ApplicationServiceLifeCycleってなんぞ?サービス呼び出し時にbeginされて、終わったらsuccess/failしてる。UnitOfWorkとかの管理してる。DIコンテナ使ってないから、Aspectとかで織り込めないってことか。いえば大体コンストラクターでリポジトリとか渡してる。アプリケーションサービスの入力パラメータ更新系はCommandオブジェクトを受け取ってる。このプロジェクトには更新系のサービスしかないや。Commandオブジェクトに必要な情報を詰め込んで渡してるんだね。書き込み系なので基本的にはvoidを返す。生成されたエンティティのIDだけを返す。値オブジェクトじゃなくて文字列を返してる。Commandクラスプロパティは、値オブジェクトじゃなくて、Stringとか基本的な型だな。CommandクラスはDTOみたいな感じだな。パラメータあり/なしのコンストラクターがあって、Getter/Setterがある。リポジトリアプリケーションサービスはリポジトリをフィールドで持ってるんだけど、それをサービス内で使うときもgetterメソッド経由で使ってる。パッケージサブパッケージ集約毎ってわけでもなさそうだな。ドメイン毎って感じか。その直下に、エンティティ、値オブジェクト、ドメインイベント、リポジトリ全部入ってる。あと、変更トラッカーも。モデルモデルはSetterに入力値のアサーションがついてる。notNullとかnotEmptyとかlengthチェックとか。コンストラクターでフィールドに値を入れたい場合でも、Setter使ってる。(本に書いてたね)アプリケーションサービスと違って、モデルは値オブジェクト使いまくるね。生成時のバリデーションProductの生成のときにどれくらい入力値チェックしてるのかなー?と思ってみてみたけど、アプリケーションサービスでもモデルでもtenantが存在してるかどうかとかはチェックしてないな。tenantがなかったら見えないプロダクトになるだけだから別に悪影響はないか。関連は基本的にモデルではチェックしない、ってことなのかな。パッケージにリポジトリの実装が入ってるリポジトリからエンティティをどうやって生成してるのかなーって思ったらLevelDBから取得した文字列からDeserializeしてるだけだった。パッケージにRabbitMQ周りの実装が入ってるキューに対して、アプリケーションサービスを呼び出してるだけだね。iddd_collaborationだいたいパッケージ構成は同じ。腐敗防止層の実装がport/adapterパッケージにある。イベントソーシングだから、リポジトリの実装とエンティティのwhenメソッドが面白い。変更イベントをMySQLに適用するために、Dispatchしてて面白い。アプリケーションサービスが、CQRSのクエリに対して、SQLを直接MySQLに発行してて面白い。クエリの結果を返すクラスの名前はAbcDataみたいにDataサフィックスがついてる。iddd_identityaccessRESTインターフェイスがあるくらいかな。面白かったーーーー!!!学びしかない。18に行ってきたということでDockerCon本編のログ。前日までのお話はここ。10年くらい常にビジネ...2015-12-282015振り返ってみると、色々やってたんだなー。(1)はてなブログをはじめよう!bufferingsさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。