前提・実現したいこと
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で設定する必要があるのでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。