.NET MAUIとCleanArchitectureで簡単なアプリを作成してみる4～実装1～

[.NET MAUIとCleanArchitectureで簡単なアプリを作成してみる3～設計～](https://qiita.com/GOROGOROMOGUMOGU/items/6b79aa9b1c83261957c3)の続き
# フォルダ構成を決める
[前回のクラス構成図](https://qiita.com/GOROGOROMOGUMOGU/items/6b79aa9b1c83261957c3#%E3%82%AF%E3%83%A9%E3%82%B9%E6%A7%8B%E6%88%90)を元にフォルダ構成を考えてみました。

```
MauiApp1ソリューション
├ MauiApp1　★プレゼンテーション層(ベースはMVVMにします)
│　　├─ Platforms
│　　│　　├─ Android
│　　│　　└─ Windows
│　　├─ Models
│　　│　　├─ Health.cs
│　　│　　└─ HealthGraph.cs
│　　├─ Views
│　　│　　├─ MainPage.xaml
│　　│　　└─ HealthEditPage.xaml
│　　└─ ViewModels
│　　  　　├─ MainViewModel.cs
│　　  　　└─ HealthEditViewModel.cs
│  
├ MauiApp1.Domain ★ドメイン(Interactorはここに移動)
│　　├─ Interactor
│　　│　　└─ Healths
│　　│　　      ├ HealthCreateInteractor.cs
│　　│　　      └ HealthGetListInteractor.cs
│　　└─ Model
│　　  　　└─ Healths
│　　  　　      ├ Health.cs
│　　  　　      └ IHealthRepository.cs
│
├ MauiApp1.SqlInfrastructure ★インフラストラクチャ
│　　└─ Healths
│　　  　　└─ HealthRepository.cs
│
└ MauiApp1.UseCase ★ユースケース
　　└─ Healths
　　　  ├ Create
　　　  │   ├ HealthCreateRequest.cs
　　　  │   ├ HealthCreateResponse.cs
　　　  │   └ IHealthCreateUseCase.cs
　　　  └  GetList
　　　  　   ├ HealthGetListRequest.cs
　　　  　   ├ HealthGetListResponse.cs
　　　  　   └ IHealthGetListUseCase.cs
```
# UseCaseを実装する
#### 新しいプロジェクトを追加する
種類「クラスライブラリ」
プロジェクト名「MauiApp1.UseCase」
フレームワーク「.NET8」
フォルダ構成は[フォルダ構成を決める(MauiApp1.UseCase)](https://qiita.com/GOROGOROMOGUMOGU/items/3803ca4a09c0800b1c86#%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E6%A7%8B%E6%88%90%E3%82%92%E6%B1%BA%E3%82%81%E3%82%8B)の通り
#### Createユースケースを作成する
インプットするリクエストを実装する
```c#:HealthCreateRequest.cs
    public class HealthCreateRequest
    {
        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="id"></param>
        /// <param name="recordDate"></param>
        /// <param name="heartNumber"></param>
        public HealthCreateRequest(int id, DateTime recordDate, int heartNumber)
        {
            Id = id;
            RecordDate = recordDate;
            HeartNumber = heartNumber;
        }

        /// <summary>
        /// ID
        /// </summary>
        public int Id { get; }
        /// <summary>
        /// 記録日付
        /// </summary>
        public DateTime RecordDate { get; }
        /// <summary>
        /// ハート数
        /// </summary>
        public int HeartNumber { get; }
    }
```
アウトプットするレスポンスを実装する
```c#:HealthCreateResponse.cs
    public class HealthCreateResponse
    {
        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="id"></param>
        public HealthCreateResponse(int id)
        {
            Id = id;
        }

        /// <summary>
        /// ID
        /// </summary>
        public int Id { get; }
    }
```
インタフェースを作成する
```c#:IHealthCreateUseCase.cs
    public interface IHealthCreateUseCase
    {
        /// <summary>
        /// 体調情報を作成する
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        HealthCreateResponse Handle(HealthCreateRequest request);
    }
```
#### GetListユースケースを作成する
インプットするリクエストを実装する
期間を指定してリクエストしたいので、開始日と終了日を持たせる
```c#:HealthGetListRequest.cs
    public class HealthGetListRequest
    {
        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="startDate"></param>
        /// <param name="endDate"></param>
        public HealthGetListRequest(DateTime startDate, DateTime endDate)
        {
            StartDate = startDate;
            EndDate = endDate;
        }

        /// <summary>
        /// 開始日
        /// </summary>
        public DateTime StartDate { get; }
        /// <summary>
        /// 終了日
        /// </summary>
        public DateTime EndDate { get; }
    }
```
アウトプットするレスポンスを実装する
体調情報をHealthDtoクラスで定義し、複数の情報を取得できるよう配列で持たせる
```c#:HealthGetListResponse.cs
    public class HealthGetListResponse
    {
        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="healths"></param>
        public HealthGetListResponse(HealthDto[] healths)
        {
            Healths = healths;
        }

        /// <summary>
        /// 体調情報
        /// </summary>
        public HealthDto[] Healths { get; }
    }

    public class HealthDto
    {
        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="id"></param>
        /// <param name="recordDate"></param>
        /// <param name="heartNumber"></param>
        public HealthDto(int id, DateTime recordDate, int heartNumber)
        {
            Id = id;
            RecordDate = recordDate;
            HeartNumber = heartNumber;
        }

        /// <summary>
        /// ID
        /// </summary>
        public int Id { get; }
        /// <summary>
        /// 記録日付
        /// </summary>
        public DateTime RecordDate { get; }
        /// <summary>
        /// ハート数
        /// </summary>
        public int HeartNumber { get; }
    }
```
インタフェースを作成する
```c#:IHealthGetListUseCase.cs
    public interface IHealthGetListUseCase
    {
        /// <summary>
        /// 体調情報リストを取得する
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        HealthGetListResponse Handle(HealthGetListRequest request);
    }
```
# 参考にしたURL
[実践クリーンアーキテクチャ](https://nrslib.com/clean-architecture/)
# まとめ
今回はフォルダ構成を決めてUseCaseを実装しました。
次はDomain、Infrastructureを実装します。
[.NET MAUIとCleanArchitectureで簡単なアプリを作成してみる4～実装2～](https://qiita.com/GOROGOROMOGUMOGU/items/566ad01665a6dd3f9d4e)