C#ユーザーのためのWebアプリ開発パターン ASP.NET Core Blazorによるエンタープライズアプリ開発

C#ユーザーのためのWebアプリ開発パターン ASP.NET Core Blazorによるエンタープライズアプリ開発

3,520円(本体 3,200円+税10%)

品種名
書籍
発売日
2024/5/20
ページ数
424
サイズ
B5変形判
著者
伊藤 稔 著/大田 一希 著/小山 崇 著/辻本 海成 著/久野 太三 著/赤間 信幸 著/赤間 信幸 監修/井上 章 著/井上 章 監修
ISBN
9784295019008

企業向けWebアプリ開発の技術と極意を詳説

JavaScriptに代わる革新的なC#フレームワーク「ASP.NET Core Blazor」による、エンタープライズ(企業向け)Webアプリ開発の解説書。日本マイクロソフトの経験豊富な.NETメンバーが執筆。

「読者アンケートに答える」「読者プレゼントに応募」の場合もこちらをご利用ください。

アンケートに答える

書籍の内容に関するお問い合わせはこちら。お答えできるのは本書に記載の内容に関することに限ります。

学校・法人一括購入に関するお問い合わせはこちらへ。

一括購入窓口

詳細

1122101173_001.jpg

著者紹介

■著者/監修者
●赤間 信幸(あかま のぶゆき)
第1章、第4章、第9章、第10章、第11章と付録の執筆、および本書出版に関わる全体監修を担当。1973年生まれ。マイクロソフトにて大企業向けのシステム開発・アーキテクチャコンサルティングに20年以上関わり、現在はカスタマーサクセス事業本部にてプリンシパルクラウドソリューションアーキテクトとして業界横断的な立ち位置で活動中。.NETやAzureの開発関連書籍を10冊執筆、社外向け講演多数。

●井上 章(いのうえ あきら)
本書出版に関わる全体監修のほか、「はじめに」「おわりに」執筆を担当。2008年、日本マイクロソフト株式会社入社。.NETやMicrosoft Azureなどの開発技術を専門とするエバンジェリストとして技術書籍やオンライン記事などの執筆、技術イベントでの講演などを行なう。2022年からは、Senior Cloud Solution ArchitectとしてCloud Native技術や開発ツールとプロセスなどを中心とした技術訴求活動に従事。2023年よりApp Innovationアーキテクト第一本部本部長を務める。

■著者
●伊藤 稔(いとう みのる)
第5章の執筆を担当。1995年生まれ。2020年に新卒採用でマイクロソフトに入社。マイクロソフトのブラウザ/IIS/Azure Bot Serviceのサポート業務に従事。

●大田 一希( おおた かずき)
技術リードとして本書全体の技術監修を担当。1981年生まれ。SIerで10年以上システム開発・社内技術標準化に携わり、その後マイクロソフトにて有償サポート契約企業に対するAzureのPaaSやアプリケーション開発に関するサポートに従事。.NETに関する開発情報の発信や書籍を数冊執筆、社内外の講演多数。

●小山 崇(こやま たかし)
第7章、第8章の執筆を担当。1969年生まれ。マイクロソフトにて大企業向けに、アプリケーションアーキテクチャを中心としたコンサルティングに20年以上従事。また、実際の企業システム開発プロジェクトにマイクロソフトメンバーとして参画し、設計から実開発まで手掛けた経験も多数。現在はクラウドソリューションアーキテクトとして、Azureの技術支援を担当。

●辻本 海成(つじもと かいせい)
第2章、第3章の執筆を担当。1995年生まれ。2020年に日本マイクロソフトへ新卒入社。Azure App Service等アプリケーション開発関連の技術営業を担当。

●久野 太三(ひさの たいぞう)
第6章の執筆を担当。1993年生まれ。マイクロソフトのブラウザサポート業務に従事。製造業にてデータ分析用Webアプリケーションの開発をしていた経験を活かし、ブラウザやWebアプリケーション、通信に関する問題解決やより良い手法の提案を行なうべく活動中。

ページイメージ

クリックすると大きい画像でご覧いただけます

目次

◆Part 1 イントロダクション
第1章 ASP.NET Core Blazorの概要

◆Part 2 Blazor Serverによるアプリ開発
第2章 データバインドの基礎
第3章 BlazorにおけるUIの組み立て方
第4章 データ入力検証(データバリデーション)
第5章 Blazor Serverランタイムの構成方法
第6章 Entity Framework Coreによるデータアクセスの基礎
第7章 Blazor Serverによるデータ参照アプリ
第8章 Blazor Serverによるデータ更新アプリ

◆Part 3 Blazor WASMによるアプリ開発
第9章 Blazor WASMの概要
第10章 Blazor WASMランタイムの構成方法

◆Part 4 Blazor Unitedによるアプリ開発
第11章 Blazor Unitedの開発スタイル

◆Appendix 付録
01 サンプルデータベースの準備方法
02 本番環境を意識したアプリ配置
03 ASP.NET Core Blazorにおける認証・認可制御
04 C#でのコーディング時に知っておきたい言語機能

関連書籍

好評発売中

ゲーム開発で学ぶC言語入門 プロのクリエイターが教える基本文法と開発技法

好評発売中

基礎C言語

言語とは?から学べるプログラミング入門書

好評発売中

1週間でC++の基礎が学べる本

7日間でC++がなんとなく使えるようになる!

ダウンロード

お詫びと訂正

誤記のためにご迷惑をおかけし、誠に申し訳ございません。

  • 0ページ 属性によるレンダリングモードの指定
    • [誤]
      ※【参考・補足情報】(誤記ではありません)
    • [正]
      p280~p295の属性によるレンダリングモードの指定に関して、

      ・.NET 8 RC時点では、属性を用いたレンダリングモードの指定として以下が利用できましたが、.NET 8製品版ではこれらの指定ができなくなりました。

      @attribute [RenderModeInteractiveServer(true/false)]
      @attribute [RenderModeInteractiveWebAssembly(true/false)]
      @attribute [RenderModeInteractiveAuto(true/false)]

      ・一方、図11.7 に記載している通り、@rendermodeを用いた指定方法の場合、既定では、サーバー側プリレンダリングを無効化するレンダリングモードの選択肢が用意されていません。このため、プリレンダリングを無効にしたレンダリングモードを利用したい場合には、ご自身のソリューションファイルに p.295 リスト 11.8に記載されているモード指定クラスを追加していただき、これを利用するようにしてください。
  • 49ページ <Router>オブジェクトに関して
    • [誤]
      ※【参考・補足情報】(誤記ではありません)
    • [正]
      <Router>オブジェクトはApp.razorファイルではなくRoutes.razorファイル内にあります。
      なお Blazor WASM型プロジェクトの場合には、<Router>オブジェクトはApp.razorファイル内にあります(=Blazor Server型プロジェクトとBlazor WASM型プロジェクトとで若干ファイルレイアウトが異なります)。
  • 53ページ OnInitializedAsync()処理について
    • [誤]
      ※【参考・補足情報】(誤記ではありません)
    • [正]
      リスト 3.8 に示されているコードサンプルですが、このページを開く際に、

      まずホームページ(例えばhttps://localhost:7224/など)を開いたのち、リンクによって遷移してきた場合には問題なく動作しますが、直接このページ(たとえば https://localhost:7224/Counterなど)を開くと、以下の例外が発生し、正しく動作しません。

      InvalidOperationException: JavaScript interop calls cannot be issued at this time. This is because the component is being statically rendered. When prerendering is enabled, JavaScript interop calls can only be performed during the OnAfterRenderAsync lifecycle method.

      これは以下の理由によるものです。

      .NET 8 以降の Blazorには、後半の第11章で解説しているプリレンダリング機能が備わっており、既定で有効化されています。
      この機能が有効化されている場合、OnInitializedAsync() 処理では JavaScript 関連の処理を記述することができません。
      ※詳細→https://learn.microsoft.com/ja-jp/aspnet/core/blazor/components/lifecycle?view=aspnetcore-8.0

      解決方法としては2通りあります。

      ① プリレンダリング機能を無効化したうえで、OnInitializedAsync() 処理に記述する(11.7.1 節にて解説)。
      ② プリレンダリング機能はそのままで、OnAfterRenderAsync(bool firstRender) 処理に記述する。

      ただし②の方法を採る場合、レンダリング処理がすでに完了しているため、このメソッドの中でデータ変数を更新しても UI 側に反映されません(再バインドされない)。このため、たとえば リスト3.8 のケースで②の方法を使う場合には、以下のように、メソッドの最後に this.StateHasChanged();命令を入れる必要があります。

      protected override async Task OnAfterRenderAsync(bool firstRender)
      {
      var result = await storage.GetAsync<int>("CurrentCount");
      currentCount = result.Success ? result.Value : 0;
      this.StateHasChanged();
      }

      状況に応じて最適な方法を選択していただくことになりますが、第11章で解説しているように、プリレンダリング機能がそもそも不要なケースも多いと思います。プリレンダリング機能が不要な場合には、①の方法の方が素直な解決策になりますので、そちらをオススメします。
  • 83ページ 図5.2
    • [誤]
      Routers.razor
    • [正]
      Routes.razor
    • 【 第2刷にて修正 】
  • 89ページ 表5.1 「備考」列の4行目
  • 131ページ 表6.1 主なアノテーション
    • [誤]
      ※【参考・補足情報】(誤記ではありません)
    • [正]
      ・"複合キーの場合は複数のカラムに [Key] を付与" としていますが、この方法では複合キーの設定はできません。

      ・アノテーションで指定する場合には、POCO クラスの属性として、
      [PrimaryKey(nameof(キー1), nameof(キー2), nameof(キー3), ...)]
      と指定する必要があります。
  • 171ページ 見出しと本文
    • [誤]
      Index.razor
    • [正]
      Home.razor
  • 203ページ 下から3行目
    • [誤]
      OnParametersSet()メソッドの処理後、OnInitializedAsync()メソッドが呼び出されます
    • [正]
      OnInitializedAsync()メソッドの処理後、OnParametersSet()メソッドが呼び出されます
    • 備考:

       このため、以下のように記述すると、不正なパラメータを使ったクエリが動作してしまうことになり、問題があります。

       
          [Parameter]
          public required string AuthorId { get; init; }
       
          // このメソッドは OnInitializedAsync() の後に動作する
          protected override void OnParametersSet()
          {
              // セキュリティ対策
              if (String.IsNullOrEmpty(AuthorId)) throw new ArgumentNullException("AuthorId");
              if (System.Text.RegularExpressions.Regex.IsMatch(AuthorId, @"^\d{3}-\d{2}-\d{4}$") == false) throw new ArgumentException("AuthorId");
          }
       
          protected override async Task OnInitializedAsync()
          {
              // 不正な URL パラメータが与えられた場合でも、この処理は動いてしまう
              await using (var pubs = await DbFactory.CreateDbContextAsync())
              {
                  Titles = (await pubs.Titles.Where(t => t.TitleAuthors
                      .Where(ta => ta.AuthorId == this.AuthorId).Count() > 0) // Count() > 0 は Any() にできない?
                      .Include(t => t.Publisher)
                      .ToListAsync()).AsQueryable();
       
                  AuthorToDisplay = await pubs.Authors
                      .Include(a => a.TitleAuthors)
                      .FirstOrDefaultAsync(a => a.AuthorId == this.AuthorId);
              }
       
              Message = AuthorToDisplay is null ?
                  null :
                  $"{AuthorToDisplay.AuthorFirstName} {AuthorToDisplay.AuthorLastName} さんの情報は以下の通りです。";
          }
       
      こちらに関しての解決方法は 2 通りあります。
       
      ① OnInitializedAsync()内で、パラメータを使った処理を行う前にチェックを行う。
      ② SetParametersAsync(ParameterView parameters)メソッドでパラメータチェックを行う。
       
      ①の方法の場合には、以下のような記述になります。シンプルでわかりやすいので、基本的にはこの方法がオススメです。
       
          [Parameter]
          public required string AuthorId { get; init; }
       
          protected override async Task OnInitializedAsync()
          {
              // セキュリティ対策
              if (String.IsNullOrEmpty(AuthorId)) throw new ArgumentNullException("AuthorId");
              if (System.Text.RegularExpressions.Regex.IsMatch(AuthorId, @"^\d{3}-\d{2}-\d{4}$") == false) throw new ArgumentException("AuthorId");
       
              await using (var pubs = await DbFactory.CreateDbContextAsync())
              {
                  Titles = (await pubs.Titles.Where(t => t.TitleAuthors
                      .Where(ta => ta.AuthorId == this.AuthorId).Count() > 0) // Count() > 0 は Any() にできない?
                      .Include(t => t.Publisher)
                      .ToListAsync()).AsQueryable();
       
                  AuthorToDisplay = await pubs.Authors
                      .Include(a => a.TitleAuthors)
                      .FirstOrDefaultAsync(a => a.AuthorId == this.AuthorId);
              }
       
              Message = AuthorToDisplay is null ?
                  null :
                  $"{AuthorToDisplay.AuthorFirstName} {AuthorToDisplay.AuthorLastName} さんの情報は以下の通りです。";
          }
      ①の方法の難点は、実際にこの値が使われないとはいえ、不正な値がAuthorIdパラメータに一時的とはいえ設定されてしまうことです。もし、そもそも AuthorId パラメータに不正な値がセットされること自体を防ぎたいのであれば、OnParametersSet()メソッドではなく、SetParametersAsync()メソッドを利用してください。この方法は、実際に [Parameter] 属性つき変数に値がセットされる前に処理を挿し込むものです。具体的な記述例としては以下になります。
       
          [Parameter]
          public required string AuthorId { get; init; }
       
          public override async Task SetParametersAsync(ParameterView parameters)
          {
              if (parameters.TryGetValue<string>(nameof(AuthorId), out var value))
              {
                  // セキュリティ対策
                  if (String.IsNullOrEmpty(value)) throw new ArgumentNullException("AuthorId : " + value);
                  if (System.Text.RegularExpressions.Regex.IsMatch(value, @"^\d{3}-\d{2}-\d{4}$") == false) throw new ArgumentException("AuthorId : " + value);
              }
              await base.SetParametersAsync(parameters);
          }
      理想論的には②が望ましいですが、コードがやや複雑になりますので、①の実装で十分なことが多いと思います。ケースバイケースで使い分けてください。
       
      なお、それなら OnParametersSet() メソッドは何のためにあるのか? という話になりますが、こちらはパラメータ値に依存するデータや UI 表示項目を更新する目的で利用します。具体例については以下のドキュメントを見てください。
       
      https://learn.microsoft.com/ja-jp/aspnet/core/blazor/components/lifecycle?view=aspnetcore-8.0#after-parameters-are-set-onparameterssetasync
    • 【 第2刷にて修正 】
  • 231ページ 本文5行目
    • [誤]
      楽観同実行制御
    • [正]
      楽観同時実行制御
    • 備考:

       

       

    • 【 第2刷にて修正 】
  • 346ページ A2.6 様々な本番環境への配置方法
    • [誤]
      ※誤記ではありません
    • [正]
      ・In-Process 型ホスティングを利用するケースとして、「IIS の Windows 統合認証機能を利用したい」というケースを挙げていますが、現在では Out-Process 型ホスティングでも IIS から認証情報を引き継ぐことができるようになりました。(https://learn.microsoft.com/ja-jp/aspnet/core/host-and-deploy/iis/out-of-process-hosting?view=aspnetcore-8.0#application-configuration)
      ・Out-Process 型ホスティングを利用したい場合には、プロジェクトファイルに OutOfProcess を追加する必要があります。(https://learn.microsoft.com/ja-jp/aspnet/core/host-and-deploy/iis/out-of-process-hosting?view=aspnetcore-8.0#out-of-process-hosting-model)

お問い合わせ

書籍の内容に関するお問い合わせはこちら。お答えできるのは本書に記載の内容に関することに限ります。

お問い合わせフォーム