.NETでクリーンアーキテクチャを実装する

.NETアプリケーションでクリーンアーキテクチャの原則を実装するための実践ガイド

Architecture .NET DDD Clean Code

はじめに

Robert C. Martin(Uncle Bob)によって広められたクリーンアーキテクチャは、コードを以下のように整理する方法を提供します:

  • フレームワークに依存しない - アーキテクチャは外部ライブラリに依存しない
  • テスト可能 - ビジネスルールはUI、データベース、外部要素なしでテスト可能
  • UIに依存しない - システムの残りを変更せずにUIを変更可能
  • データベースに依存しない - ビジネスルールはデータベースに縛られない

レイヤー構成

ドメイン層

最も内側のレイヤーには以下が含まれます:

  • エンティティ
  • 値オブジェクト
  • ドメインイベント
  • インターフェース(リポジトリ契約)
public class Order : Entity
{
    public OrderId Id { get; private set; }
    public CustomerId CustomerId { get; private set; }
    public OrderStatus Status { get; private set; }

    public void Confirm()
    {
        if (Status != OrderStatus.Pending)
            throw new InvalidOperationException();

        Status = OrderStatus.Confirmed;
        AddDomainEvent(new OrderConfirmedEvent(this));
    }
}

アプリケーション層

ユースケースとアプリケーション固有のビジネスルールが含まれます:

public class ConfirmOrderHandler : IRequestHandler<ConfirmOrderCommand>
{
    private readonly IOrderRepository _orderRepository;

    public async Task Handle(ConfirmOrderCommand request)
    {
        var order = await _orderRepository.GetByIdAsync(request.OrderId);
        order.Confirm();
        await _orderRepository.SaveAsync(order);
    }
}

主なメリット

  1. 保守性 - あるレイヤーの変更が他に影響しない
  2. テスト容易性 - ビジネスロジックのユニットテストが書きやすい
  3. 柔軟性 - 実装の交換が容易

まとめ

クリーンアーキテクチャは初期設定に時間がかかりますが、複雑なアプリケーションにおける保守性とテスト容易性の長期的なメリットは価値があります。