ドメイン駆動設計の値オブジェクトの作成時のバリデーションを
AppConfig.jsonから読み込んだ値を使用して評価処理を行う
仕様クラスを作成して実現しようと考えているのですが
その評価処理はどこで行うべきかで悩んでます。
具体的には下記のように名前属性のみ持つ値オブジェクトがあり、
c#
1public Class Person 2{ 3 public string Name { get; } 4 5 public Person(string name) 6 { 7 Name = name; 8 } 9}
その名前属性の最大文字数をAppConfig.json内から取得するためのクラスのインターフェースがあり、
c#
1public interface IAppConfigJsonReader 2{ 3 int PersonMaxNameLength { get; } 4}
上記のインターフェースを使用して下記のような名前の文字数の仕様クラスを作成しました。
c#
1public class PersonNameLengthSpecification 2{ 3 private IAppConfigJsonReader _configReader; 4 5 public PersonNameLengthSpecification(IAppConfigJsonReader configReader) 6 { 7 _configReader = configReader; 8 } 9 10 public bool IsSatisfiedBy(Person person) 11 { 12 var name = person.Name; 13 var length = name.Length; 14 var maxLength = _configReader.PersonMaxNameLength; 15 return length <= maxLength; 16 } 17}
しかしこの仕様クラスを使って実際にIsSatisfiedByメソッドで
バリデーションを行う場所はどこがよいのでしょうか?
候補としては3つありますがそれぞれデメリットがあります。
- アプリケーションサービスのユースケース内でファクトリーかnew演算子を用いてPersonを生成した直後に判定
- ファクトリー内で判定処理を組みアプリケーションサービスのユースケース内でそのファクトリを使用してPersonを生成
- 値オブジェクトのコンストラクタ内で判定
候補1では判定の判定処理の漏れが発生しそうな気がします。
候補2ではコンストラクタインジェクションが複雑化してしまいます。
候補3ではコンストラクタの引数にIAppConfigJsonReaderを含める必要ができてしまいます。
ほかにももっと良い方法があるのなら教えていただきたいです。
どうかよろしくおねがいします。
あなたの回答
tips
プレビュー