質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
blazor

Blazorは、マイクロソフトが開発している.NETベースのWebアプリフレームワークです。C#でフロントエンドもバックエンドも一貫して書くことが可能。クライアントサイド(WebAssembly)とサーバーサイド形式のホスティングモデルがあります。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

1614閲覧

[Blazor ]Startup.ConfigureServices内のservices.AddSingletonについて

WBD212

総合スコア5

blazor

Blazorは、マイクロソフトが開発している.NETベースのWebアプリフレームワークです。C#でフロントエンドもバックエンドも一貫して書くことが可能。クライアントサイド(WebAssembly)とサーバーサイド形式のホスティングモデルがあります。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2021/04/13 04:07

前提・実現したいこと

Blazorについて学習中で、CRUD画面を試しに作成しました。
作成した画面の動作自体は想定通りに動作するのですが、
Blazorプロジェクトを作成した際に自動的に作成されるStartup.ConfigureServicesで
services.AddSingletonを設定している行をコメントアウトすると動作不良となります。
(ページの切り替えができなくなり、例外をキャッチできない)

services.AddSingletonは必ず設定しないといけないものなのでしょうか?

作成したコード

追加したコード

C#

1using Microsoft.EntityFrameworkCore; 2using System; 3using System.Collections.Generic; 4using System.Linq; 5using System.Threading.Tasks; 6 7namespace test.Data 8{ 9 public class PersonDbContext : DbContext 10 { 11 public DbSet<Person> Persons { get; set; } 12 13 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 14 { 15 optionsBuilder.UseSqlServer(@"Server=localhost;Database=TEST;Trusted_Connection=True;"); 16 } 17 } 18 public class Person 19 { 20 public int Id { get; set; } 21 public string Name { get; set; } 22 public int Age { get; set; } 23 } 24}

FetchData.razorを変更したコード

C#

1@page "/fetchdata" 2 3@using test.Data 4@inject WeatherForecastService ForecastService 5 6<h1>CRUDテスト画面</h1> 7 8 9@if (Persons == null) 10{ 11 <p><em>Loading...</em></p> 12} 13else 14{ 15 <table class="table"> 16 <thead> 17 <tr> 18 <th>Id</th> 19 <th>Name</th> 20 <th>Age</th> 21 </tr> 22 </thead> 23 @foreach (var it in Persons) 24 { 25 <tr @onclick="e => onSelected(it)" style="@(it == InputPerson ? "background:lightblue" : "")"> 26 <td>@it.Id</td> 27 <td>@it.Name</td> 28 <td>@it.Age</td> 29 </tr> 30 } 31 </table> 32 33 <div class="form-group"> 34 @if (Mode) 35 {<label for="author" style="background-color:lightblue">新規登録</label>} 36 else 37 {<label for="author" style="background-color:lightblue">更新</label>} 38 </div> 39 40 <div class="form-group"> 41 <label for="author">名前</label> 42 <input type="text" id="input_Name" @bind="InputPerson.Name" class="form-control" width="150" /> 43 </div> 44 <div class="form-group"> 45 <label for="author">年齢</label> 46 <input type="number" id="input_Age" @bind="InputPerson.Age" class="form-control" width="150" /> 47 </div> 48 49 <button class="btn btn-primary" @onclick="Submit">登録</button> 50 @if (!Mode) 51 {<button class="btn btn-primary" @onclick="Delete">削除</button>} 52} 53 54@code { 55 private List<Person> Persons; 56 private Person InputPerson = new Person(); 57 private bool Mode = true; 58 59 protected override void OnInitialized() 60 { 61 try 62 { 63 using (var db = new PersonDbContext()) 64 { 65 this.Persons = db.Persons.ToList(); 66 } 67 } 68 catch (Exception e) 69 { 70 Console.WriteLine(e.Message); 71 } 72 } 73 74 private void onSelected(Person p) 75 { 76 InputPerson = p; 77 Mode = false; 78 } 79 80 private void Delete() 81 { 82 try 83 { 84 using (var db = new PersonDbContext()) 85 { 86 var p = db.Persons.Single(x => x.Id == InputPerson.Id); 87 db.Persons.Remove(p); 88 db.SaveChanges(); 89 InputPerson = new Person(); 90 this.Persons = db.Persons.ToList(); 91 Mode = true; 92 } 93 } 94 catch (Exception e) 95 { 96 Console.WriteLine(e.Message); 97 } 98 } 99 100 private void Submit() 101 { 102 try 103 { 104 using (var db = new PersonDbContext()) 105 { 106 if (Mode) 107 { 108 db.Persons.Add(InputPerson); 109 db.SaveChanges(); 110 } 111 else 112 { 113 var p = db.Persons.Single(x => x.Id == InputPerson.Id); 114 p.Name = InputPerson.Name; 115 p.Age = InputPerson.Age; 116 db.SaveChanges(); 117 InputPerson = new Person(); 118 } 119 120 this.Persons = db.Persons.ToList(); 121 Mode = true; 122 } 123 } 124 catch (Exception e) 125 { 126 Console.WriteLine(e.Message); 127 } 128 } 129}

試したこと

C#

1 public void ConfigureServices(IServiceCollection services) 2 { 3 services.AddRazorPages(); 4 services.AddServerSideBlazor(); 5 services.AddSingleton<WeatherForecastService>(); // ←この行をコメントアウトすると動作しない 6 }

services.AddSingletonを設定している行をコメントアウトすると動作不良になる。

補足情報

services.AddSingletonを設定している行を削除しようとした理由は、
自動で作成されるWeatherForecastServiceが不要になったため削除したところ、
該当行で使用されいたためです。

WeatherForecastServiceを削除する代わりに何か代わりのものをservices.AddSingletonで設定する必要があるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決しました。

FetchData.razor内の3行目「@inject WeatherForecastService ForecastService」を削除することにより解決しました。

services.AddSingletonをコメントアウトしているのに「@inject~」で依存関係を参照しようとしているために発生しているエラーのようです。

投稿2021/04/13 04:19

WBD212

総合スコア5

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問