.net core 주입 의 세 가지 모델:Singleton,Scoped,Transient

전편 의 내용 이 제목 보다 못 한 문장 인 에서.net core 주입 중의 세 가지 모델 을 확장 했다.싱글 톤,Scoped,Transient
우 리 는 모두 Startup 의 Configure Services 에서 우리 가 원 하 는 서 비 스 를 주입 할 수 있다 는 것 을 알 고 있 습 니 다.그러면 주입 할 때 세 가지 모델 을 선택 할 수 있 습 니 다.그러면 우 리 는 언제 어떤 모델 을 선택 합 니까?
주입 모델 을 말 하기 전에 서비스 생존 기의 개념 을 이해 할 필요 가 있다 고 생각 합 니 다!
서비스 생존 기간:ASP.NET Core 는 내 장 된 서비스 용기 인 IServiceProvider 가 서 비 스 를 관리 하 는 생명 주 기 를 제공 합 니 다.주입 용기 생 성에 의존 하 는 것 부터(서 비 스 를 사용 할 클래스 의 구조 함수 에 주입 하 는 것)그리고 프레임 워 크 는 의존 관 계 를 만 드 는 인 스 턴 스 를 책임 집 니 다.더 이상 필요 하지 않 을 때 처리 합 니 다.
IServiceProvider 는 어떻게 맡 았 나 요?

// System.IServiceProvider
using System;

public interface IServiceProvider
{
 object GetService(Type serviceType);
}
GetService 라 는 인 터 페 이 스 를 통 해 서 비 스 를 제공 하 는 대상 을 얻 을 수 있 음 을 알 수 있다.그럼 좀 더 깊이 찾 아 보 세 요.Microsoft.Extensions.Dependency Injection 이 이 용 기 를 어떻게 제공 하 는 지 보 겠 습 니 다.

//Microsoft.Extensions.DependencyInjection.IServiceProviderFactory<TContainerBuilder>
using Microsoft.Extensions.DependencyInjection;
using System;

public interface IServiceProviderFactory<TContainerBuilder>
{
 TContainerBuilder CreateBuilder(IServiceCollection services);

 IServiceProvider CreateServiceProvider(TContainerBuilder containerBuilder);
}
위의 IServiceProvider Factory 인 터 페 이 스 를 보면 익숙 하지 않 습 니까?이 용기 안에 IServiceCollection(서비스 집합)이 있 을 것 입 니 다.그러면 서 비 스 는 어떻게 들 어 갑 니까?

//Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions
using System;

private static IServiceCollection Add(IServiceCollection collection, Type serviceType, Type implementationType, ServiceLifetime lifetime)
{
 ServiceDescriptor item = new ServiceDescriptor(serviceType, implementationType, lifetime);
 collection.Add(item);
 return collection;
}
여기까지 잘 알 고 있 습 니 다.오늘 의 주제 에 도 가 까 워 졌 습 니 다.바로 오 세 요.

// Microsoft.Extensions.DependencyInjection.ServiceLifetime
public enum ServiceLifetime
{
 Singleton,
 Scoped,
 Transient
}
위의 매 거 진 안 에는 싱글 톤,Scoped,Transient 세 가지 모델 이 제공 되 어 있다..net core 및 보 내 는 스 레 드 안전 문제안 으로 들 어가 보 세 요.이 세 가지 모델 을 먼저 알 아 보 세 요.ServiceCollection Service Extensions 에 서 는 세 가지 방법 만 있 습 니 다.(무 거 운 짐 이 있 습 니 다)

소스 코드 에서 볼 수 있 듯 이 이 세 가지 방법 은 IService Collection 을 계승 하 는 것 이다.자,이 세 가지 모델 을 말 해 보 세 요.먼저,우리 가 관심 이 없 기 때 문 입 니 다.
(1)Singleton 단일 인 스 턴 스 모드:단일 인 스 턴 스 대상 은 모든 대상 과 모든 요청 이 같 습 니 다.서로 다른 클 라 이언 트 의 서로 다른 요청 이 같다 고 할 수 있 습 니 다.
(2)Transient 일시 적 모드:일시 적 대상 은 항상 다 릅 니 다.같은 요청(같은 요청 의 다른 서비스)이 든 아니 든 같은 클 라 이언 트 는 매번 새로운 인 스 턴 스 를 만 듭 니 다.
(3)Scoped 역할 영역 모드:역할 영역 대상 은 클 라 이언 트 요청 에서 같 지만 여러 클 라 이언 트 요청 에서 다 릅 니 다.(이 말 은 문서 의 원 어 입 니 다.저 는 분명하게 묘사 한 것 같 습 니 다)
언제 어떤 모드 를 사용 합 니까?이것 은 그다지 말 하기 어렵다.
예 를 들 면:
1.로그 기록 기 는 하나의 예 로 실현 할 수 있 습 니 다.전체 수명 주기 에 하나의 인 스 턴 스 만 사용 할 수 있 기 때 문 입 니 다.
2.데이터베이스 액세스 컨 텍스트(DbContext)에서 Scoped 를 선택 하 는 것 이 가장 좋 은 후보 일 것 입 니 다.services.AddDbContext 기본 값 은 Scoped(하하 하)이기 때 문 입 니 다.
3.깊이 의존 관계 도(a deep dependency graph)를 이용 하여 유일한 대상 을 만 들 려 면 이 대상 을 transient 로 등록 하 는 것 을 고려 할 수 있 습 니 다.
그리고 다른 사람 이 어떻게 말 하 는 지 보 세 요.

그리고 Stackoverflow 의...

다른 사람의 경험 에 따라 참고 할 수 있다.

어떻게 검증 합 니까?결 과 를마이크로소프트 문서로 실행 해 보 세 요.
브 라 우 저의 첫 번 째 tab 페이지(첫 번 째 요청 은 클 라 이언 트 라 고 볼 수 있 습 니 다):

브 라 우 저의 두 번 째 tab 페이지(두 번 째 요청 은 다른 클 라 이언 트 라 고 볼 수 있 습 니 다):

위의 결 과 를 보면 더 이상 말 하지 않 겠 다.
이 확장 인식 은 꽤 재미있게 썼 다.특히 이 세 가지 모델 의 사용 장면 을 찾 고 있다.비록 자신 이 약간의 견 해 를 가지 고 있 지만 절대 완전 하지 않다.더 좋 은 견해 라면 함께 나 누고 싶 습 니 다.
다음 편 확장 은 원천 으로 돌아 갈 것 같 습 니 다.훑 기.net core 의 주입,하하 하....................................................
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기