前回までで,AreaIdクラスを完成させました。今回はそのAreaIdクラスをEntityに乗せます。そうすることで,EntityのプロパティがValueObjectになり,使う側は,すべての処理を選択できるようになります。
Entityの変更
次のようにEntityを改造します。
using NDDD.Domain.ValueObjects; using System; namespace NDDD.Domain.Entities { public sealed class MeasureEntity { public MeasureEntity(int areaId, DateTime measureDate, float measureValue) { AreaId = new AreaId(areaId); MeasureDate = measureDate; MeasureValue = measureValue; } public AreaId AreaId { get; } public DateTime MeasureDate { get; } public float MeasureValue { get; } } }
まず,intだったAreaIdをAreaId型にします。Usingがないとエラーとなるのでusing NDDD.Domain.ValueObjects;を追加しておいてください。
そしたら,AreaIdを設定しているコンストラクタでエラーとなるので,AreaIdクラスでNewするように変更します。これで,EntityでValueObjectが運べるようになりました。
ViewModelで使用する
あとは,MeasureEntityのAreaIdを使用していた場所の修正をします。LatestViewModelのSearch()メソッドのAreaIdTextを設定している場所で使用していましたが,この部分はAreaIdのDisplayValueを設定するだけで,いままで通りの動きをするようになります。
public void Search() { var measure = _measureRepository.GetLatest(); AreaIdText = measure.AreaId.DisplayValue; MeasureDateText = measure.MeasureDate.ToString("yyyy/MM/dd HH:mm:ss"); MeasureValueText = Math.Round(measure.MeasureValue, 2) + "℃"; }
動作の確認
これまで通り,エリアIDが編集されていることが確認できます。