ValidationAttributreでDIされたオブジェクトを取得する

こんにちは。beaglesoftの真鍋です。

このところ、開発しているときにあれどうだったっけ…?ってGoogleとかで検索をすると過去に書いたブログのエントリーが表示されることがあり記録を残すことは大事だと痛感してながら開発をしています。

以前同じような内容をASP.NET MVC5でまとめたのですが、ASP.NET MVC Coreでどうするのかをまとめていなかったのでこちらにまとめます。

blog.beaglesoft.net

やりたいこと

通常コントローラーのリクエストでバインドされるフィールドの値は検証処理を行うと思います。その検証処理は形式的なチェックもあると思うのですが、例えば登録済みのメールアドレスかどうかをチェックするというようなものもあると思います。この処理をデータベースの登録前に実行するということはもちろん必要ですが、コントローラーからサービスへ処理を行うまでにそもそも実行する必要がないものを弾きたいことはあると思います。

そのようなユースケースではValidationAttributreを利用して独自に検証処理を作成することができます。

今回はValidationAttributreでStartup.csなどでDIされたオブジェクトを利用する方法をまとめます。

具体的な方法

ValidationAttributreでDIされたオブジェクトを利用するためには、ValidationAttribute#IsValid(object value, ValidationContext validationContext)をオーバーライドして利用します。

IsValid(object value, ValidationContext validationContext)validationContextには GetService(Type serviceType) が定義されているので、このメソッドからDIしているオブジェクトを取得できます。

var service = (ISomeService) validationContext.GetService(typeof(ISomeService));

これでValidationAttributeでもDIされたオブジェクトを利用することができるようになるため、いろいろな検証処理をリクエストまでに実行することができるようになりますね。

エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)

エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)

PostgresでUUIDを生成する

こんにちは。ビーグルソフトの真鍋です。

前回のUUID生成と同じくPostgresでUUIDを生成したくなったので調べてみました。実際にはRDS上のPostgresを利用しているので参考にしてみてください。

blog.beaglesoft.net

バージョン情報

=> SELECT version();
                                                 version
----------------------------------------------------------------------------------------------------------
 PostgreSQL 9.6.10 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9), 64-bit
(1 row)

生成方法

UUIDをPostgresで生成するにはpgcryptoが必要になります。

F.25.5. ランダムデータ関数

そのためあらかじめExtensionがインストールされていることを確認します。

=> SELECT * FROM pg_available_extensions WHERE name = 'pgcrypto';
   name   | default_version | installed_version |         comment
----------+-----------------+-------------------+-------------------------
 pgcrypto | 1.3             | 1.3               | cryptographic functions
(1 row)

今回はすでにインストールされていますが、インストールするには以下のSQLを実行します。

=> CREATE EXTENSION if not exists pgcrypto;
NOTICE:  extension "pgcrypto" already exists, skipping
CREATE EXTENSION

以下の通りgen_random_uuidを実行するとuuidのバージョン4を生成してくれます。

=>  select gen_random_uuid();
           gen_random_uuid
--------------------------------------
 e61de8d7-2822-4544-9c92-4ce89f667396
(1 row)

[改訂新版]内部構造から学ぶPostgreSQL 設計・運用計画の鉄則 (Software Design plus)

[改訂新版]内部構造から学ぶPostgreSQL 設計・運用計画の鉄則 (Software Design plus)

LinuxやMacでUUIDを生成するコマンド

こんにちは。beaglesoftの真鍋です。

今回はLinuxやMacのシェルでUUIDを生成するときに便利なuuidgenを紹介します。

何するものか?

uuidgenはUUIDを生成するためのコマンドです。

使ってみる

以下の通り利用できます。

$ uuidgen
8D4F960F-8E4D-484E-B429-5CCEA11C7880

manを確認すると以下の通りとなっています。

NAME
     uuidgen -- generates new UUID strings

SYNOPSIS
     uuidgen [-hdr]

DESCRIPTION
     The uuidgen command generates a Universally Unique IDentifier (UUID), a 128-bit value guaranteed to be unique over both space and time.

     The following options are available:

     -hdr      Emit CoreFoundation CFUUID-based source code for using the uuid in a header.

RETURN VALUE
     The UUID is printed to standard output as a hyphen-punctuated ASCII string of the form: EEF45689-BBE5-4FB6-9E80-41B78F6578E2 (in printf(3) format
     "%08X-%04X-%04X-%04X-%012X"), unless the -hdr option is given, in which case a fragment of source code is output.

-hdrオプションを付けると、生成したときのマクロが表示されます。これの使いみちがよくわかりません…。

$  uuidgen -hdr
// 198AE91D-3E5B-4790-9465-ABC49E025442
#warning Change the macro name MYUUID below to something useful!
#define MYUUID CFUUIDGetConstantUUIDWithBytes(kCFAllocatorSystemDefault, 0x20, 0xAA,...)

感想

タイムスタンプを利用しようかと思ったのですが、uuidがshellで生成できることを知りませんでした。今後利用する機会が増えそうです。