Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
いまさらだけど ASP.NET MVC のアプリケーション アーキテクチャをおさらいする / Reconsideration for application architecture of ASP.NET MVC
Takashi Shinohara
May 22, 2018
Programming
0
2k
いまさらだけど ASP.NET MVC のアプリケーション アーキテクチャをおさらいする / Reconsideration for application architecture of ASP.NET MVC
Takashi Shinohara
May 22, 2018
Tweet
Share
More Decks by Takashi Shinohara
See All by Takashi Shinohara
Microsoft Teams の 会議アプリ開発のはじめかた / How to start Microsoft Teams app development
karamem0
0
1.5k
Web API 開発を加速しよう - Avanade Beef のご紹介 / Accelerate your web API - development introducing Avanade Beef
karamem0
0
280
Japan Microsot 365 Developer Community Day 2021: Microsoft Teams ハンズオン / Japan Microsot 365 Developer Community Day 2021: Microsoft Teams Hands-on
karamem0
0
3
Microsoft 365 開発をはじめる人のための React 超入門 / Super introduction to react for those starting Microsoft 365 development
karamem0
0
570
Microsoft Build 2021 最新版! Microsoft Teams アプリ開発のいま / Microsoft Teams app development now (Microsoft Build 2021 latest version)
karamem0
0
1.1k
スクラムで Power Apps 開発をやってみた / Tried to develop Power Apps with Scrum
karamem0
1
1.6k
Power Apps/Power Automate for Office 365 でできる SharePoint リストを使ったアプリの構築 / Building apps with SharePoint lists via Power Apps and Power Automate for Office 365
karamem0
1
2.9k
Global Microsoft 365 Developer Bootcamp 2020 Tokyo: Teams 開発ハンズオン / Hands-on training for Global Microsoft 365 Developer Bootcamp 2020 Tokyo: Teams Development
karamem0
0
290
Azure AD でセキュリティ保護された Web アプリケーションで Microsoft Graph を使用する / Using Microsoft Graph in Azure AD secured web applications
karamem0
0
390
Other Decks in Programming
See All in Programming
Git Rebase
bkuhlmann
7
1k
Milestoner
bkuhlmann
1
200
偏見と妄想で語るスクリプト言語としての Swift / Swift as a Scripting Language
lovee
1
150
Swift Concurrencyによる安全で快適な非同期処理
tattn
2
160
Becoming an Android Librarian
skydoves
3
420
코드 품질 1% 올리기
pluu
1
910
アプリのログをチーム外で活用してもらうためにやったこと
shotakashihara
0
130
roadmap to rust 2024
matsu7874
1
620
機能横断型チームにおける技術改善
takeshiakutsu
3
430
Is Rust a great language for building Kubernetes ecosystem
deepu105
0
140
LOWYAの信頼性向上とNew Relic
kazumax55
4
330
CIでAndroidUIテストの様子を録画してみた
mkeeda
0
150
Featured
See All Featured
A Tale of Four Properties
chriscoyier
149
20k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
349
27k
Building Your Own Lightsaber
phodgson
94
4.6k
Principles of Awesome APIs and How to Build Them.
keavy
113
15k
YesSQL, Process and Tooling at Scale
rocio
157
12k
WebSockets: Embracing the real-time Web
robhawkes
57
5k
Rebuilding a faster, lazier Slack
samanthasiow
62
7.2k
Designing for Performance
lara
596
63k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
212
20k
How to train your dragon (web standard)
notwaldorf
57
3.8k
Practical Orchestrator
shlominoach
178
8.6k
The Language of Interfaces
destraynor
148
20k
Transcript
いまさらだけど ASP.NET MVC の アプリケーション アーキテクチャを おさらいする 篠原敬志 (@karamem0)
自己紹介 • 篠原敬志 (Takashi Shinohara) • Microsoft MVP for Office
Development (2018-) • Twitter: @karamem0 • Blog: からめもぶろぐ。(http://blog.karamem0.jp) 2
なんでいまさら • ASP.NET MVC 1.0 のリリースは 2009 年 3 月
• ASP.NET MVC はすでに枯れた技術のはず • なのになんで私はこんなスパゲティ コードと戦ってるんだろう? 3
ということは • ASP.NET MVC でのアプリケーション アーキテクチャってあまり議論されていない? • Ruby on Rails
界隈ではめっちゃ議論されてる • 過去の記事を鵜呑みにしたままなんとなく今日までやってきてない? • 2009~2010 年頃の記事が普通に検索結果のトップに出てくる • 小手先の技術ばかり見ていて全体を掴めてなくない? • それはそれで大事ではあるけれども 4
(本当にいまさらだけど) ASP.NET MVC の アプリケーション アーキテクチャを おさらいしよう 5
ASP.NET MVC の基本 6 • View はユーザー インターフェイスを提供 する •
Controller はユーザーからの入力を処 理し、Model を操作し、View をレン ダリングする • Model はビジネス ロジックを提供する Model Controller View
ASP.NET MVC のアプリケーション レイヤー 7 ユーザー プレゼンテーション レイヤー UI コンポーネント
プレゼンテーション ロジック コンポーネント サービス レイヤー サービス インターフェイス メッセージの種類 ビジネス レイヤー アプリケーション ファサード ビジネス ワークフロー ビジネス コンポーネント ビジネス エンティティ データ レイヤー データ アクセス コンポーネント データ ヘルパー/ ユーティリティ サービス エージェント セキュリティ 運用管理 通信 分野横断的な懸念事項 外部システム データ ソース サービス View Controller Model
Skinny Controller, Fat Model • 本当に大事なのは Model • Controller は
View と Model の橋渡しに過ぎない • Model は複数のレイヤーをまたがる • Model 全体としては Fat だが特定のクラス が Fat になることはない 8
ASP.NET MVC における Model • Model ≠ Entity Model •
スキャフォールディングはアンチ パターン • View と Entity Model が直接結びつくことはありえない • Controller にビジネス ロジックが混在する原因に • ステートレス • トランザクション スクリプト 9
ASP.NET MVC の Model をさらに分解する 10 View Controller Model Repository
View View Model Controller Domain Model Entity Model Service Facade プレゼンテー ション レイヤー サービス レイヤー サービス インターフェイス メッセージの種類 ビジネス レイヤー アプリケーション ファサード ビジネス ワークフロー ビジネス コンポーネント ビジネス エンティティ データ レイヤー データ アクセス コンポーネント データ ヘルパー/ ユーティリティ サービス エージェント UI コンポーネント プレゼンテーション ロジック コンポーネント
Entity Model • 外部データの Entity を表現する • 外部データが RDBMS の場合は
Entity Framework • 外部キーを付ける • 主キーが存在しないテーブルを作成しない • 基本はサロゲート キー (ナチュラル キーも使える) • rowversion 列を付ける • 外部データには Web API や DocumentDB なども 考えられる 11 View Controller Model Repository View View Model Controller Domain Model Entity Model Service Facade
Repository • 外部データへのデータ アクセス操作 (CRUD 操作) を提供する • RDBMS (Entity
Framework) の場合は DbContext クラス • 外部データが RDBMS 以外の場合は自作する • コレクションの場合は IQueryable<T> を返す 12 View Controller Model Repository View View Model Controller Domain Model Entity Model Service Facade
Domain Model • ビジネス ロジックでの Entity を表現する • Entity Model
と 1 対 1 にはならない • RDBMS から変換されるデータであれば SQL の SELECT の結果になる • データは状況によって非正規化される • 不必要なデータは含まれない • データの読み込みと書き込みが同じ Model になる とは限らない (CQRS) 13 View Controller Model Repository View View Model Controller Domain Model Entity Model Service Facade
Service • Entity Model と Domain Model との変換を提供 する •
LINQ to Entities によるクエリ操作を隠蔽する • コレクションの場合は IEnumerable<T> を返す • トランザクションの単位 14 View Controller Model Repository View View Model Controller Domain Model Entity Model Service Facade
View Model • View のレンダリングに必要なデータを格納する構造 化された Entity • 検証のための属性を定義する •
シリアライズ化可能 • ViewBag や ViewData は極力使用しない 15 View Controller Model Repository View View Model Controller Domain Model Entity Model Service Facade
Facade • Controller からの呼び出しの入り口で、1 つ以上の Service を呼び出し ViewModel を返す •
Controller と 1 対 1 で作成する • ビジネス ロジックは含まない 16 View Controller Model Repository View View Model Controller Domain Model Entity Model Service Facade
Controller • インプット データの検証 • Facade の呼び出し • エラー ハンドリング
• Action 以外のメソッドが存在したら負け 17 View Controller Model Repository View View Model Controller Domain Model Entity Model Service Facade
View • ViewModel のバインドと HTML のレンダリング • Razor によるマークアップ •
レイアウト • タグ ヘルパー • 部分ビュー 18 View Controller Model Repository View View Model Controller Domain Model Entity Model Service Facade
ASP.NET MVC の単体テスト 19
単体テストの実施 • それぞれのレイヤーは疎結合になるので単体テストの実施が容易になる • 単体テストを実施するためにレイヤーを分割するのではない • すべてのレイヤーをテストする必要はない • コード カバレッジ
100% を目指さない 20
単体テストのフレームワーク • 依存関係の注入 (Dependency Injection) • Unity (開発終了?) • Autofac
• Grace • Ninject • モック (Mock) • Fakes (Visual Studio Enterprise のみ) • Moq 21
単体テストのスコープ • Service のテストで Repository をモックするのはアンチ パターン • IQueryable<T> ≠
IEnumerable<T> • 発行される SQL が正しいことを確認する (Database.Log プロパティ) • SQL LocalDB + Code First を使うと便利 • Controller のテストでは Service をモックする • 外部データにはアクセスしない • HttpContext もモックしないと駄目だったりする 22
まとめ 23
まとめ • MVC だからといってこれまでのアプリケーション アーキテクチャが大幅に変わるわけ ではない • 本当に大事なのは Model (2
回目) • ASP.NET MVC は Ruby on Rails に影響を受けているので Ruby on Rails でさ んざん議論されてきたことはだいたい ASP.NET MVC にも当てはまる 24
参考リンク • ASP.NET MVC の概要 https://msdn.microsoft.com/ja-jp/library/dd381412.aspx • アプリケーション アーキテクチャ ガイド
2.0 https://msdn.microsoft.com/ja-jp/library/gg998968.aspx • コマンド クエリ責務分離 (CQRS) パターン https://docs.microsoft.com/ja-jp/azure/architecture/patterns/cqrs 25