ドメイン駆動開発_フォルダー構成編_#39_AreaIdクラスをEntityに乗せる

当サイトではアフィリエイト広告を利用しています。

NDDD

前回までで,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が編集されていることが確認できます。