Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ASP.NET8 CoreでClean Architecture入門

dora56
February 03, 2024
200

ASP.NET8 CoreでClean Architecture入門

Fukuoka.NET Conf 2023の発表資料

dora56

February 03, 2024
Tweet

Transcript

  1. The Clean Architecture Robert C. Martin (ボブおじさん)⽒が提唱した ソフトウェア設計思想。 エンティティ(ビジネスロジック)を中⼼にUI やDBなどの依存関係を疎結合にし、

    保守性、テスト容易性、変更容易性を実現させ るための設計アプローチの⼀つ Application Architecture Clean Architectureとは︖ Clean Coder Blog
  2. The Clean Architecture Robert C. Martin (ボブおじさん)⽒が提唱した ソフトウェア設計思想。 エンティティ(ビジネスロジック)を中⼼にUI やDBなどの依存関係を疎結合にし、

    保守性、テスト容易性、変更容易性を実現させ るための設計アプローチの⼀つ Application Architecture Clean Architectureとは︖ 保守しやすく、変化に強いソフトウェアを作ること Clean Coder Blog
  3. Clean Architectureのレイヤー Clean Architectureの特性 Enterprise Business Rules Application Business Roles

    Infrastructure Interface Adaptter Entity/Domain Application/Usecase Frameworks/driver Presentation/Controller/Gateway
  4. Clean Architectureのレイヤー Clean Architectureの特性 Domain Application /Usecase Infrastructure Presentation ビジネスロジックの集合

    ビジネスルールの集合 技術的関⼼事の集合 外部公開インターフェースの集合
  5. クリーンアーキテクチャの原則(SOLID原則) 単⼀責任 の原則 Single Responsibility オープン・ クローズド の原則 Open-Closed リスコフの

    置換原則 Liskov Substitution インター フェイス 分離の原則 Interface Segregation 依存性逆転 の原則 Dependency Inversion Clean Architectureとは︖
  6. コードサンプル // クエリの定義 public class GetUserQuery : IRequest<User> { public

    GetUserQuery(string id) { Id = id; } public string Id { get; } } どのように実装するのか
  7. ハンドラー // クエリのHandler public class GetUserHandler : IRequestHandler<GetUserQuery, User> {

    private readonly IUserRepository _repository; public GetUserHandler(IUserRepository repository) { _repository = repository; } public Task<User> Handle(GetUserQuery request, CancellationToken cancellationToken) { var user = await _repository.GetByIdAsync(new UserId(request.Id)); var model = user == null ??; return Task.FromResult(model); } } どのように実装するのか
  8. 呼び出し public void ConfigureServices(IServiceCollection services) { services.AddMediatR(typeof(GetUserHandler).Assembly); // 他のサービスの登録も⾏う }

    // 呼び出し public async Task<int> GetUser(ISender sender, GetUserQuery query) { return await sender.Send(query); } どのように実装するのか
  9. サンプルディレクトリ . ├── src │ ├── Application │ ├── Domain

    │ ├── Infrastructure │ ├── Presentation どのように実装するのか
  10. レイヤーテスト [Fact] public void DomainLayer_ShouldNotHaveDependencyOn_ApplicationLayer() { TestResult result = Types.InAssembly(DomainAssembly)

    .Should() .NotHaveDependencyOn(ApplicationAssembly.GetName().Name) .GetResult(); result.IsSuccessful.Should().BeTrue(); } [Fact] public void DomainLayer_ShouldNotHaveDependencyOn_InfrastructureLayer() { TestResult result = Types.InAssembly(DomainAssembly) .Should() .NotHaveDependencyOn(InfrastructureAssembly.GetName().Name) .GetResult(); result.IsSuccessful.Should().BeTrue(); } どのように実装するのか
  11. l ardalis/CleanArchitecture: Clean Architecture Solution Template: A starting point for

    Clean Architecture with ASP.NET Core (github.com) lhttps://github.com/ardalis/CleanArchitecture/tree/main l Clean Architecture with ASP.NET Core 8 | .NET Conf 2023 (youtube.com) lhttps://github.com/ardalis/CleanArchitecture/tree/main コードサンプル集 どのように実装するのか
  12. l Clean Architecture Solution Template for ASP.NET Core lhttps://github.com/jasontaylordev/CleanArchitecture l

    Unleashing Clean Architecture in .NET 8 - Jason Taylor - Copenhagen DevFest 2023 – YouTube lhttps://www.youtube.com/watch?v=yB01HaG0i0w コードサンプル集 どのように実装するのか