Як працює Dependency Injection в Blazor Server
Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті
Привіт!
Сьогодні поговоримо, як працює dependency injection в blazor server. Якщо ви знайомі з dependency injection в asp.net core то відміностей тут немає. Dependency injection налаштовуєтся в Startup.cs
в корені проекта. Одразу після створення проекту це матиме ось такий вигляд:
public void ConfigureServices(IServiceCollection services) { services.AddRazorPages(); services.AddServerSideBlazor(); services.AddSingleton<WeatherForecastService>(); }
Розберемо, що тут відбуваться.
services.AddRazorPages()
— додає підтримку razor pages в проект.
services.AddServerSideBlazor()
— додає підтримку blazor server в проект .
services.AddSingleton<WeatherForecastService>()
— реєструє клас WeatherForecastService
в DI.
WeatherForecastService
в прикладі додається як Singleton
. Може бути ще Scoped
i Transient
. Детальніше на них подивимось далі.
Спробуємо додати новий клас в DI і перевірити як він працює з різними типами (Singleton, Scoped, Transient).
Для цього в папці Data
я створю файл, який буде генерувати випадкове число.
using System; namespace BlazorLearn.Data { public class RandomData { private readonly int randomData; public RandomData() { Random random = new Random(); randomData = random.Next(); } public int GetRandomData() { return randomData; } } }
В класі RandomData
в конструкторі генерується випадкове число. А метод GetRandomData
вертає його. Для того щоб використати клас в DI потрібно створити інтерфейс. Можна користуватись і без інтерфейса. Aле завдяки інтерфейсу легко можна замінити в реалізації цей клас на інший. Так буде виглядати інтерфейс.
namespace BlazorLearn.Data { public interface IRandomData { int GetRandomData(); } }
Singleton
Тепер клас можна зареєструвати в DI. Поченемо з Singleton. Для цього в Startup.cs
файлі в методі ConfigureServices
потрібно додати:
services.AddSingleton<IRandomData, RandomData>();
Тепер кожен раз, як хтось буде використовувати інтерфейс IRandomData
, буде підставлено RandomData
.
Тепер в index.razor
я викличу GetRandomNumber
метод.
@page "/" @using BlazorLearn.Data @inject IRandomData RandomData <h1>Hello, world!</h1> Welcome to your new app. Your random number is @RandomData.GetRandomData() <SurveyPrompt Title="How is Blazor working for you?" />
@inject IRandomData RandomData
виликає конструктор нашого класу. І запустимо аплікацію.
Якщо я відкрию аплікацію в іншому браузері випадкове число залишиться таким самим. Саме так працює singleton. Об’єкт створюється один раз при старті аплікації.
Scoped
Прдивимось тепер як працює scoped. Замінимо AddSingleton
на AddScoped
services.AddScoped<IRandomData, RandomData>();
І запустимо аплцікацію. Тепер якщо я перейду на іншу сторінку сайту, а потім повернусь назад, число залишиться таким самим. А от якщо я оновлю сторінку, то число поміняться. Scoped обєкти створюються один раз на кожен запит.
Transient
І останій тип це Transient
. Тепер замінимо AddScoped
на AddTransient
services.AddTransient<IRandomData, RandomData>();
Запустимо аплікацію. І тепер навіть якщо перейти з однієї вкладки на іншу, число змінюється кожен раз.
DI in Class
І на кінець: подивимось, як можна використати RandomData
клас в іншому класі за допомогою DI.
Для прикладу візьмемо Data/WeatherForecastService.cs
. В цьому класі потрібно зробити зміну типу IRandomData
і ініціалізувати її в конструкторі. І тепер її можна використовувати в будь якому місці цього класу.
using System; using System.Linq; using System.Threading.Tasks; namespace BlazorLearn.Data { public class WeatherForecastService { private IRandomData _randomData; private static readonly string[] Summaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" }; public WeatherForecastService(IRandomData randomData) { _randomData = randomData; } public Task<WeatherForecast[]> GetForecastAsync(DateTime startDate) { var rng = new Random(); return Task.FromResult(Enumerable.Range(1, 5).Select(index => new WeatherForecast { Date = startDate.AddDays(index), TemperatureC = _randomData.GetRandomData(), Summary = Summaries[rng.Next(Summaries.Length)] }).ToArray()); } } }
_randomData.GetRandomData()
я запишу в зміну TemperatureC
і запущу аплікацію. На сторінці FetchData
буде тепература, зегенерована за допомогою GetRandomData
.
Важливо, щоб в DI WeatherForecastService
та RandomData
були одинаково додані.
services.AddScoped<WeatherForecastService>(); services.AddScoped<IRandomData, RandomData>();
Немає коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів