EventFlowでのイベントの格納先をEventStoreに変更する

#はじめに
[CQRS+ES and DDD frameworkのEventFlowの紹介][]の続きです。
EventFlowでのイベントの格納先をEventStoreに変更するための方法について投稿します。

#そもそも
EventFlowではイベントの格納先を変更することができます。
[ドキュメント](https://eventflow.readthedocs.io/EventStore.html)から引用すると

> * In-memory (for test)
> * Microsoft SQL Server
> * Files (for test)

が書かれていますがEventStore用の拡張がNugetにあったのでそちらを試してみます。
[CQRS+ES and DDD frameworkのEventFlowの紹介][]で使用しているソースを元に説明します。

#Nuget取得

[EventFlow.EventStores.EventStore](https://www.nuget.org/packages/EventFlow.EventStores.EventStore/0.74.3948?_src=template)

#初期設定に追加

```C#
EventFlowOptions.New
.UseEventStoreEventStore(new Uri("tcp://admin:changeit@localhost:1113"), ConnectionSettings.Default)
```

EventFlowOptionsにUseEventStoreEventStoreを追加するだけです。
ConnectionSettingsでEventStoreの設定を変更することができます。
ポイントはUriの指定で、tcpで接続する必要があります。
今回はlocalhostでEventStoreが動作している前提です。

#実行結果例
![localhost_2113_web_index.html.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109302/92d2cd2d-c852-e17e-550a-1df0fce03a00.png)

#おまけ ファイルに出力する設定

```C#
EventFlowOptions.New
.UseFilesEventStore(FilesEventStoreConfiguration.Create(@".\store"))
```

UseEventStoreEventStoreをUseFilesEventStoreに変更するだけです。
両方設定した場合は後勝ちでした。
なにも設定しないとIn-memoryになります。

フォルダ構造は指定した名前でフォルダが出来て、Identity名でフォルダができて、イベント毎にファイルができます。

ファイルの中身は↓(カンマで改行いれてます)

```text:2.json
{"GlobalSequenceNumber":5,
"AggregateId":"本のid-a6ab9cd6-9532-43e4-8649-7606e94c3645",
"Data":"{\"貸出期間\":{\"貸出期間自\":{\"Value\":\"2019-07-08T00:00:00+09:00\"},
\"貸出期間至\":{\"Value\":\"2019-07-22T00:00:00+09:00\"}},
\"利用者のID\":{\"Value\":\"利用者のid-5e59577f-57d6-4433-83e8-2baaaff2aed0\"}}",
"Metadata":"{\"request_header[Accept]\":\"text/html,
application/xhtml+xml,
application/xml;q=0.9,
*/*;q=0.8\",
\"request_header[Accept-Encoding]\":\"gzip,
 deflate\",
\"request_header[Accept-Language]\":\"ja\",
\"request_header[Cache-Control]\":\"max-age=0\",
\"request_header[Connection]\":\"Keep-Alive\",
\"request_header[Content-Length]\":\"182\",
\"request_header[Content-Type]\":\"application/x-www-form-urlencoded\",
\"request_header[Host]\":\"localhost:60774\",
\"request_header[Referer]\":\"http://localhost:60774/Book/Index\",
\"request_header[User-Agent]\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,
 like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134\",
\"request_header[Upgrade-Insecure-Requests]\":\"1\",
\"request_uri\":\"/Book\",
\"request_proto\":\"HTTP/1.1\",
\"request_method\":\"POST\",
\"remote_ip_address\":\"::1\",
\"timestamp\":\"2019-07-08T11:02:47.2903357+09:00\",
\"aggregate_sequence_number\":\"2\",
\"aggregate_name\":\"本\",
\"aggregate_id\":\"本のid-a6ab9cd6-9532-43e4-8649-7606e94c3645\",
\"event_id\":\"event-448cb39e-6615-5dde-865a-dc777edac597\",
\"timestamp_epoch\":\"1562551367\",
\"batch_id\":\"9e9f25d5-29c1-44fe-a173-aded4f0e0a1f\",
\"source_id\":\"command-b4517a65-79f0-466a-9ccc-c49f09015af1\",
\"event_name\":\"本を借りた\",
\"event_version\":\"1\"}",
"AggregateSequenceNumber":2}
```

#まとめ
イベントの格納先の差替えが楽で助かります。

[EventFlow.SQLite](https://www.nuget.org/packages/EventFlow.SQLite/)など他にもイベントの格納先は選べるみたいです。



[CQRS+ES and DDD frameworkのEventFlowの紹介]:https://qiita.com/kwhrkzk/items/0a2de89725a83f2fed3b