Slide 1

Slide 1 text

Fukuoka.NET Conf 2023 ASP.NET 8 Coreでクリーンアーキテクチャ⼊⾨

Slide 2

Slide 2 text

/r-hanaoka @dora56 ⾃⼰紹介 @karyu721 l 花岡 ⿓ l 株式会社 オルターブース l Azure, GitHub 導⼊⽀援 l 趣味: 読書・ゲーム

Slide 3

Slide 3 text

内容について ごめんなさい、.NET8 要素薄いです Clean Architecture要素多めです

Slide 4

Slide 4 text

⽬次 l Clean Architectureとは︖ l Claen Architectureの特性 l どのように実装するのか︖

Slide 5

Slide 5 text

Clean Architectureとは︖

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

類似のアプリケーションアーキテクチャ Clean Architectureとは︖ ヘキサゴナル アーキテクチャ オニオン アーキテクチャ ドメイン駆動設計 レイアードアーキテクチャ

Slide 9

Slide 9 text

類似のアプリケーションアーキテクチャ Clean Architectureとは︖ ヘキサゴナル アーキテクチャ オニオン アーキテクチャ ドメイン駆動設計 レイアードアーキテクチャ インターフェースやデータベースなど 技術的関⼼事からビジネスロジックを分離させている

Slide 10

Slide 10 text

なぜどれも似ているのか︖ Clean Architectureとは︖

Slide 11

Slide 11 text

そもそもSoftware Architectureとは “ソフトウェアアーキテクチャの ⽬的は求められるシステムを 構築・保守するために必要な⼈材 を最⼩限に抑える事である。” Clean Architectureとは︖ Clean Architecture 達⼈に学ぶソフトウェアの構造と設計 Robert C.Martin (著) ⾓ 征典 (翻訳), ⾼⽊ 正弘 (翻訳) より引⽤

Slide 12

Slide 12 text

アーキテクチャのルールはどれも同じ “使われている素材は今も昔も変わっていない (中略)実際に書いているコードは「順次」「選 択」「反復」の組み合わせに過ぎず、50年代や60年 代から何も変わっていない。(中略)書いている コードが変わらないのだから、どんな種類のシステ ムでもソフトウェアアーキテクチャのルールは同 じ。ソフトウェアアーキテクチャのルールとは、 プログラムの構成要素をどのように組み⽴てるかの ルールである。構成要素は普遍的で変わらないのだ から、それらを組み⽴てるルールもまた、普遍的で 変わらないのである。” Clean Architectureとは︖ Clean Architecture 達⼈に学ぶソフトウェアの構造と設計 Robert C.Martin (著) ⾓ 征典 (翻訳), ⾼⽊ 正弘 (翻訳) 1章より引⽤

Slide 13

Slide 13 text

ボブおじさんがいうClean Architectureとは ボブおじさんが⻑年の経験を元に Software Architectureの原理・原則を まとめたもの Clean Architectureとは︖

Slide 14

Slide 14 text

ボブおじさんは”Clean”シリーズの本を出している Clean Architectureとは︖

Slide 15

Slide 15 text

Clean Architectureの特性

Slide 16

Slide 16 text

Clean Architectureの特性 関⼼事の分離 依存性のルール 保守容易性

Slide 17

Slide 17 text

Clean Architectureの特性 関⼼事の分離 依存性のルール 保守容易性

Slide 18

Slide 18 text

依存性のルール ソースコードの依存性は、内側(上位レベルの⽅針) だけに向かっていなければいけない。 Clean Architectureの特性

Slide 19

Slide 19 text

Clean Architectureのレイヤー Clean Architectureの特性 Clean Coder Blog

Slide 20

Slide 20 text

Clean Architectureのレイヤー Clean Architectureの特性 Enterprise Business Rules Application Business Roles Infrastructure Interface Adaptter Entity/Domain Application/Usecase Frameworks/driver Presentation/Controller/Gateway

Slide 21

Slide 21 text

Clean Architectureのレイヤー Clean Architectureの特性 Domain Application /Usecase Infrastructure Presentation ビジネスロジックの集合 ビジネスルールの集合 技術的関⼼事の集合 外部公開インターフェースの集合

Slide 22

Slide 22 text

Domainとは ドメインとはソフトウェアが解決しようとする領域の専⾨知識 ビジネスルールに基づいてデータや情報の計算、加⼯、判断を⾏う。 純粋な関数の集合とみなせる。 例: アナグラムクイズ 1. 7012 を⼊⼒ 2. アナグラム関数がビジネスルールに基づいて計算、加⼯ 3. 2017と出⼒ 純粋なビジネスロジックの集合 Clean Architectureの特性

Slide 23

Slide 23 text

Usecaseとは ビジネスルールに基づいてデータや情報の計算、加⼯、判断を⾏う。 純粋な関数の集合とみなせる。 例: アナグラムクイズ 1. 7012 を⼊⼒ 2. アナグラム関数がビジネスルールに基づいて計算、加⼯ 3. 2017と返す 純粋なビジネスロジックの集合 Clean Architectureの特性

Slide 24

Slide 24 text

Interfaceが無い依存関係 Clean Architectureの特性 各レイヤーの詳細を知らなければならない Domain Application /Usecase Infrastructure Presentation

Slide 25

Slide 25 text

依存関係逆転 Clean Architectureの特性 Domain Application /Usecase Infrastructure Presentation Interface Interface Interface 各レイヤーの詳細を知らずに済む Interfaceが境界

Slide 26

Slide 26 text

Clean Architectureの特性 関⼼事の分離 依存性のルール 保守容易性

Slide 27

Slide 27 text

関⼼事の分離 フレームワーク に依存しない テスト可能 UIに 依存しない データ ベースに 依存しない 外部機能に 依存しない Clean Architectureの特性

Slide 28

Slide 28 text

アーキテクチャは、機能満載のソフトウェアのライブラリが⼿に⼊る ことには依存しない。これは、そういったフレームワークを道具とし て使うことを可能にし、システムをフレームワークの限定された制約 に押し込めなければならないようなことにはさせない。 フレームワークに依存しない Clean Architectureの特性 関⼼事の分離

Slide 29

Slide 29 text

ビジネスルールは、UI、データベース、ウェブサーバー、その 他外部の要素なしにテストできる。 テスト可能 Clean Architectureの特性 関⼼事の分離

Slide 30

Slide 30 text

UIは、容易に変更できる。システムの残りの部分を変更する必 要はない。たとえば、ウェブUIは、ビジネスルールの変更なし に、コンソールUIと置き換えられる。 UIに依存しない Clean Architectureの特性 関⼼事の分離

Slide 31

Slide 31 text

OracleあるいはSQL Serverを、Mongo, BigTable, CoucheDB あるいは他のものと交換することができる。ビジネスルールは、 データベースに拘束されない。 データベースに依存しない Clean Architectureの特性 関⼼事の分離

Slide 32

Slide 32 text

実際のところ、ビジネスルールは、単に外側についてなにも知 らない。 外部機能に依存しない Clean Architectureの特性 関⼼事の分離

Slide 33

Slide 33 text

Clean Architectureの特性 関⼼事の分離 依存性のルール 保守容易性 Clean Architectureの特性

Slide 34

Slide 34 text

l テスト容易性 l依存性逆転の法則により、UIやDBや外部機能に依存せずにテスト可能 l 変更容易性 l依存性逆転の法則により、Domainがその他のレイヤーによる変更を 受けにくくなる l関⼼の分離により、外部の影響を受けずビジネスの変化に対応しやすく なる 保守容易性 Clean Architectureの特性

Slide 35

Slide 35 text

クリーンアーキテクチャの原則(SOLID原則) 単⼀責任 の原則 Single Responsibility オープン・ クローズド の原則 Open-Closed リスコフの 置換原則 Liskov Substitution インター フェイス 分離の原則 Interface Segregation 依存性逆転 の原則 Dependency Inversion Clean Architectureとは︖

Slide 36

Slide 36 text

どのように実装するのか

Slide 37

Slide 37 text

技術要素 どのように実装するのか ドメイン イベント CQRS MediatR ArchiTest

Slide 38

Slide 38 text

ドメインイベント(処理の流れ) どのように実装するのか Presentation(Web/API)からApplicationにリクエスト Domain Application /Usecase Infrastructure Presentation

Slide 39

Slide 39 text

ドメインイベント どのように実装するのか リクエストをもとにドメインがビジネスルールに基づいて 処理(計算・加⼯・判断)を実⾏ Domain Application /Usecase Infrastructure Presentation

Slide 40

Slide 40 text

ドメインイベント どのように実装するのか Domain Eventを発⾏ 処理結果を渡す Domain Application /Usecase Infrastructure Presentation Domain Event

Slide 41

Slide 41 text

ドメインイベント どのように実装するのか Domain Eventを受け取る Domain Application /Usecase Infrastructure Presentation Domain Event

Slide 42

Slide 42 text

ドメインイベント どのように実装するのか Domain Eventの内容をもとに DB処理やメール処理など技術的な処理を⾏う Domain Application /Usecase Infrastructure Presentation

Slide 43

Slide 43 text

ドメインイベント どのように実装するのか 結果を返す Domainに状態を持たせずに処理ができる Domain Application /Usecase Infrastructure Presentation

Slide 44

Slide 44 text

CQRS(コマンドクエリ責務分離) どのように実装するのか CQRS パターン - Azure Architecture Center | Microsoft Learn

Slide 45

Slide 45 text

l シンプルなMediatorパターンを実装したライブラリ l これを使ってCQRSを実現できる MediatR どのように実装するのか

Slide 46

Slide 46 text

コードサンプル // クエリの定義 public class GetUserQuery : IRequest { public GetUserQuery(string id) { Id = id; } public string Id { get; } } どのように実装するのか

Slide 47

Slide 47 text

ハンドラー // クエリのHandler public class GetUserHandler : IRequestHandler { private readonly IUserRepository _repository; public GetUserHandler(IUserRepository repository) { _repository = repository; } public Task Handle(GetUserQuery request, CancellationToken cancellationToken) { var user = await _repository.GetByIdAsync(new UserId(request.Id)); var model = user == null ??; return Task.FromResult(model); } } どのように実装するのか

Slide 48

Slide 48 text

呼び出し public void ConfigureServices(IServiceCollection services) { services.AddMediatR(typeof(GetUserHandler).Assembly); // 他のサービスの登録も⾏う } // 呼び出し public async Task GetUser(ISender sender, GetUserQuery query) { return await sender.Send(query); } どのように実装するのか

Slide 49

Slide 49 text

l .NETアプリケーションのアーキテクチャルルールを テストするためのライブラリ l ユニットテストでアプリケーションの設計規則を強制できる l https://github.com/TNG/ArchUnitNET l 他にもArchiUnitNetがある lThttps://github.com/TNG/ArchUnitNET NetArchiTest どのように実装するのか ※イベント時にAchiTest.NETと⾔いましたが正しくはNetArchiTestです🙇

Slide 50

Slide 50 text

サンプルディレクトリ . ├── src │ ├── Application │ ├── Domain │ ├── Infrastructure │ ├── Presentation どのように実装するのか

Slide 51

Slide 51 text

レイヤーテスト [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(); } どのように実装するのか

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

l ソフトウェアアーキテクチャのルールはプログラム構成要素を 組み⽴てることだからどれも同じ l ドメインは純粋関数、純粋なビジネスロジックの集まり l Clean Architectureの特性は 依存性のルール、関⼼事の分離、保守容易性 l ArchiTest.NETを使うと設計原則をチームで守れる まとめ