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

いまさらだけど ASP.NET MVC のアプリケーション アーキテクチャをおさらいする / Reconsideration for application architecture of ASP.NET MVC

いまさらだけど ASP.NET MVC のアプリケーション アーキテクチャをおさらいする / Reconsideration for application architecture of ASP.NET MVC

Takashi Shinohara

May 22, 2018
Tweet

More Decks by Takashi Shinohara

Other Decks in Programming

Transcript

  1. いまさらだけど ASP.NET MVC の
    アプリケーション アーキテクチャを
    おさらいする
    篠原敬志 (@karamem0)

    View Slide

  2. 自己紹介
    • 篠原敬志 (Takashi Shinohara)
    • Microsoft MVP for Office Development (2018-)
    • Twitter: @karamem0
    • Blog: からめもぶろぐ。(http://blog.karamem0.jp)
    2

    View Slide

  3. なんでいまさら
    • ASP.NET MVC 1.0 のリリースは 2009 年 3 月
    • ASP.NET MVC はすでに枯れた技術のはず
    • なのになんで私はこんなスパゲティ コードと戦ってるんだろう?
    3

    View Slide

  4. ということは
    • ASP.NET MVC でのアプリケーション アーキテクチャってあまり議論されていない?
    • Ruby on Rails 界隈ではめっちゃ議論されてる
    • 過去の記事を鵜呑みにしたままなんとなく今日までやってきてない?
    • 2009~2010 年頃の記事が普通に検索結果のトップに出てくる
    • 小手先の技術ばかり見ていて全体を掴めてなくない?
    • それはそれで大事ではあるけれども
    4

    View Slide

  5. (本当にいまさらだけど)
    ASP.NET MVC の
    アプリケーション アーキテクチャを
    おさらいしよう
    5

    View Slide

  6. ASP.NET MVC の基本
    6
    • View はユーザー インターフェイスを提供
    する
    • Controller はユーザーからの入力を処
    理し、Model を操作し、View をレン
    ダリングする
    • Model はビジネス ロジックを提供する
    Model
    Controller
    View

    View Slide

  7. ASP.NET MVC のアプリケーション レイヤー
    7
    ユーザー
    プレゼンテーション
    レイヤー
    UI コンポーネント
    プレゼンテーション ロジック
    コンポーネント
    サービス
    レイヤー
    サービス インターフェイス メッセージの種類
    ビジネス
    レイヤー
    アプリケーション ファサード
    ビジネス ワークフロー ビジネス コンポーネント ビジネス エンティティ
    データ
    レイヤー
    データ アクセス
    コンポーネント
    データ ヘルパー/
    ユーティリティ
    サービス エージェント
    セキュリティ
    運用管理
    通信
    分野横断的な懸念事項
    外部システム
    データ ソース サービス
    View
    Controller
    Model

    View Slide

  8. Skinny Controller, Fat Model
    • 本当に大事なのは Model
    • Controller は View と Model の橋渡しに過ぎない
    • Model は複数のレイヤーをまたがる
    • Model 全体としては Fat だが特定のクラス が Fat になることはない
    8

    View Slide

  9. ASP.NET MVC における Model
    • Model ≠ Entity Model
    • スキャフォールディングはアンチ パターン
    • View と Entity Model が直接結びつくことはありえない
    • Controller にビジネス ロジックが混在する原因に
    • ステートレス
    • トランザクション スクリプト
    9

    View Slide

  10. ASP.NET MVC の Model をさらに分解する
    10
    View
    Controller
    Model
    Repository
    View
    View Model
    Controller
    Domain Model
    Entity Model
    Service
    Facade
    プレゼンテー
    ション
    レイヤー
    サービス
    レイヤー
    サービス インターフェイス メッセージの種類
    ビジネス
    レイヤー
    アプリケーション ファサード
    ビジネス ワークフロー ビジネス コンポーネント
    ビジネス エンティティ
    データ
    レイヤー
    データ アクセス
    コンポーネント
    データ ヘルパー/
    ユーティリティ
    サービス エージェント
    UI コンポーネント
    プレゼンテーション ロジック
    コンポーネント

    View Slide

  11. 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

    View Slide

  12. Repository
    • 外部データへのデータ アクセス操作 (CRUD 操作)
    を提供する
    • RDBMS (Entity Framework) の場合は
    DbContext クラス
    • 外部データが RDBMS 以外の場合は自作する
    • コレクションの場合は IQueryable を返す
    12
    View
    Controller
    Model
    Repository
    View
    View Model
    Controller
    Domain Model
    Entity Model
    Service
    Facade

    View Slide

  13. 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

    View Slide

  14. Service
    • Entity Model と Domain Model との変換を提供
    する
    • LINQ to Entities によるクエリ操作を隠蔽する
    • コレクションの場合は IEnumerable を返す
    • トランザクションの単位
    14
    View
    Controller
    Model
    Repository
    View
    View Model
    Controller
    Domain Model
    Entity Model
    Service
    Facade

    View Slide

  15. View Model
    • View のレンダリングに必要なデータを格納する構造
    化された Entity
    • 検証のための属性を定義する
    • シリアライズ化可能
    • ViewBag や ViewData は極力使用しない
    15
    View
    Controller
    Model
    Repository
    View
    View Model
    Controller
    Domain Model
    Entity Model
    Service
    Facade

    View Slide

  16. Facade
    • Controller からの呼び出しの入り口で、1 つ以上の
    Service を呼び出し ViewModel を返す
    • Controller と 1 対 1 で作成する
    • ビジネス ロジックは含まない
    16
    View
    Controller
    Model
    Repository
    View
    View Model
    Controller
    Domain Model
    Entity Model
    Service
    Facade

    View Slide

  17. Controller
    • インプット データの検証
    • Facade の呼び出し
    • エラー ハンドリング
    • Action 以外のメソッドが存在したら負け
    17
    View
    Controller
    Model
    Repository
    View
    View Model
    Controller
    Domain Model
    Entity Model
    Service
    Facade

    View Slide

  18. View
    • ViewModel のバインドと HTML のレンダリング
    • Razor によるマークアップ
    • レイアウト
    • タグ ヘルパー
    • 部分ビュー
    18
    View
    Controller
    Model
    Repository
    View
    View Model
    Controller
    Domain Model
    Entity Model
    Service
    Facade

    View Slide

  19. ASP.NET MVC の単体テスト
    19

    View Slide

  20. 単体テストの実施
    • それぞれのレイヤーは疎結合になるので単体テストの実施が容易になる
    • 単体テストを実施するためにレイヤーを分割するのではない
    • すべてのレイヤーをテストする必要はない
    • コード カバレッジ 100% を目指さない
    20

    View Slide

  21. 単体テストのフレームワーク
    • 依存関係の注入 (Dependency Injection)
    • Unity (開発終了?)
    • Autofac
    • Grace
    • Ninject
    • モック (Mock)
    • Fakes (Visual Studio Enterprise のみ)
    • Moq
    21

    View Slide

  22. 単体テストのスコープ
    • Service のテストで Repository をモックするのはアンチ パターン
    • IQueryable ≠ IEnumerable
    • 発行される SQL が正しいことを確認する (Database.Log プロパティ)
    • SQL LocalDB + Code First を使うと便利
    • Controller のテストでは Service をモックする
    • 外部データにはアクセスしない
    • HttpContext もモックしないと駄目だったりする
    22

    View Slide

  23. まとめ
    23

    View Slide

  24. まとめ
    • MVC だからといってこれまでのアプリケーション アーキテクチャが大幅に変わるわけ
    ではない
    • 本当に大事なのは Model (2 回目)
    • ASP.NET MVC は Ruby on Rails に影響を受けているので Ruby on Rails でさ
    んざん議論されてきたことはだいたい ASP.NET MVC にも当てはまる
    24

    View Slide

  25. 参考リンク
    • 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

    View Slide