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

ASP.NET8 CoreでClean Architecture入門

Avatar for dora56 dora56
February 03, 2024
630

ASP.NET8 CoreでClean Architecture入門

Fukuoka.NET Conf 2023の発表資料

Avatar for dora56

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 コードサンプル集 どのように実装するのか