永続化のための検証が必要だと仮定します。
ビューだけでなく、モデルも検証を処理するべきではありません。ITでの日々の中で、DDDは実際に正しく作業を行っていることを確認する方法の1つであることに気付きました。クラスは実際にそれらがどうあるべきかについて責任があります。
ドメイン駆動設計に従う場合、モデルにはビジネスロジックが含まれますが、それだけです。しかし、検証は含まれていません。なぜでしょうか。
ドメインレイヤーを永続化するのData Mapper
ではなく、すでに使用していると仮定しますActive Record
。ただし、それでもモデルを検証する必要があるため、モデルに検証を追加します。
interface Validation
{
public function validate();
}
class ConcreteModel extends MyModel implements Validation
{
public function validate() { // the validation logic goes here }
}
検証ロジックにより、モデルをMySQLデータベースに正しく挿入できるようになります...数か月後、モデルを、MySQLとは異なる検証ルールを必要とするnoSQLデータベースにも保存したいとします。
しかし、問題がありModel
ます。検証方法は1つしかありませんが、2つの異なる方法で検証する必要があります。
モデルは、彼らが責任を負うことを実行する必要があり、ビジネスロジックを処理して適切に実行する必要があります。検証はビジネスロジックではなく永続性に関連付けられているため、検証はモデルに属しません。
Validator
代わりにを作成する必要があります。これは、コンストラクターで検証するモデルをパラメーターとして取り、Validation
インターフェイスを実装し、これらValidator
のを使用してオブジェクトを検証します。
interface Validation
{
public function validate();
}
class MySQLConcreteModelValidator implements Validation
{
public function __construct(ConcreteModel $model) { }
public function validate()
{
// you validate your model here
}
}
class RedisConcreteModelValidator implements Validation
{
public function __construct(ConcreteModel $model) { }
public function validate()
{
// you validate your model with different set of rules here
}
}
将来いつでも別の永続化レイヤーに別の検証メソッドを追加したい場合(RedisとMySQLはもう進む方法ではないと判断したため)、別のものValidator
を作成し、IoC
コンテナーを使用して適切なインスタンスベースを取得しますあなたのconfig
。