Dependency injection (종속성 주입)

2022. 4. 6. 00:00ASPNET/Blazor

반응형

Blazor Server

기본적으로 ASPNet Core 의 DI System 을 사용한다. 

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();
builder.Services.AddSingleton<WeatherForecastService>();
builder.Services.AddSingleton<IDataAccess, DataAccess>();

 

서비스 수명

Scoped Blazor WebAssembly 앱에는 현재, DI 범위에 대한 개념이 없습니다. Scoped 등록 서비스는 Singleton 서비스처럼 동작합니다.
Blazor 서버 호스팅 모델은 HTTP 요청에서 Scoped 수명을 지원하지만 클라이언트에서 로드되는 구성 요소 간의 SignalR 연결/회로 메시지에서는 지원하지 않습니다. Razor Pages 또는 앱의 MVC 부분은 범위가 지정된 서비스를 정상적으로 처리하고, 페이지 또는 뷰 사이를 이동하거나 페이지 또는 뷰에서 구성 요소로 이동할 때 각 HTTP 요청에서 서비스를 다시 만듭니다. 클라이언트의 구성 요소 사이를 이동할 때는 범위가 지정된 서비스가 다시 구성되지 않습니다. 이 경우 서버와의 통신은 HTTP 요청을 통하지 않고 사용자 회로의 SignalR 연결을 통해 이루어집니다. 클라이언트에서 다음과 같은 구성 요소 시나리오에서는 사용자를 위해 새 회로가 만들어지므로 범위가 지정된 서비스가 다시 구성됩니다.
  • 사용자가 브라우저의 창을 닫습니다. 사용자가 새 창을 열고 앱으로 다시 이동합니다.
  • 사용자가 브라우저 창에서 앱의 탭을 닫습니다. 사용자가 새 탭을 열고 앱으로 다시 이동합니다.
  • 사용자가 브라우저의 다시 로드/새로 고침 단추를 선택합니다.
Blazor Server 앱의 범위가 지정된 서비스에서 사용자 상태를 보존하는 방법에 대한 자세한 내용은 ASP.NET Core Blazor hosting models를 참조하세요.
Singleton DI는 서비스의 단일 인스턴스를 만듭니다. Singleton 서비스가 필요한 모든 구성 요소는 서비스의 같은 인스턴스를 수신합니다.
Transient 구성 요소는 서비스 컨테이너에서 Transient 서비스의 인스턴스를 가져올 때마다 서비스의 Transient을 받습니다.

 

Components 에서 서비스 요청

 

@inject 를 이용하여 DI 를 통해 ServiceCollection 에 주입된 Service 를 사용할 수 있다. 

@page "/customer-list"
@inject IDataAccess DataRepository

@if (customers != null)
{
    <ul>
        @foreach (var customer in customers)
        {
            <li>@customer.FirstName @customer.LastName</li>
        }
    </ul>
}

@code {
    private IReadOnlyList<Customer>? customers;

    protected override async Task OnInitializedAsync()
    {
        customers = await DataRepository.GetAllCustomersAsync();
    }

    private class Customer
    {
        public string? FirstName { get; set; }
        public string? LastName { get; set; }
    }

    private interface IDataAccess
    {
        public Task<IReadOnlyList<Customer>> GetAllCustomersAsync();
    }
}

 

서비스에서 DI 사용

program.cs 에서 다음 추가

builder.Services.AddHttpClient();

Data/WeatherForecastService.cs 의 생성자에 다음 추가

public class WeatherForecastService
{
    private static readonly string[] Summaries = new[]
    {
    "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };
    private readonly HttpClient _httpClient;

    public WeatherForecastService(IHttpClientFactory httpClientFactory)
    {
        _httpClient = httpClientFactory.CreateClient();
    }

    public Task<WeatherForecast[]> GetForecastAsync(DateTime startDate)
    {
        return Task.FromResult(Enumerable.Range(1, 5).Select(index => new WeatherForecast
        {
            Date = startDate.AddDays(index),
            TemperatureC = Random.Shared.Next(-20, 55),
            Summary = Summaries[Random.Shared.Next(Summaries.Length)]
        }).ToArray());
    }
}

DI 범위

Blazor 서버 앱에서 요청 범위는 클라이언트 연결 기간 동안 지속되므로

임시 및 범위가 지정된 서비스가 예상보다 훨씬 오래 지속될 수 있습니다.

Blazor WebAssembly 앱에서, 범위가 지정된 수명으로 등록된 서비스는

싱글톤으로 처리되므로 일반적인 ASP.NET Core 앱의 범위가 지정된 서비스보다 오래 지속됩니다.

 

 

관련영상

https://youtu.be/SF2YIeomZxg

 

 

반응형

'ASPNET > Blazor' 카테고리의 다른 글

Logging  (0) 2022.04.08
Startup  (0) 2022.04.07
라우팅 및 탐색 (Routing and Navigation 2/2)  (0) 2022.04.05
라우팅 및 탐색 (Routing and Navigation 1/2)  (0) 2022.04.04
Blazor 코드 분석  (0) 2022.04.01