5

콘솔 .NET Core 응용 프로그램을 빌드하고 있습니다. 주기적으로 작업을 수행하는 메소드를 실행합니다. 어떻게 ServiceProvider를 ASP.NET 핵심 응용 프로그램에서와 동일한 방식으로 동작하게합니까? 메소드가 실행을 시작할 때 범위가 지정된 서비스를 해결하고 메소드의 끝 부분에서 해결 된 서비스를 처리하기를 원합니다..NET Core에서 기본 종속성 삽입을 사용하여 부모로부터 하위 범위를 만드는 방법은 무엇입니까?

// pseudocode 

globalProvider.AddScoped<ExampleService>(); 

// ... 

using (var scopedProvider = globalProvider.CreateChildScope()) 
{ 
    var exampleService = scopedProvider.Resolve<ExampleService>(); 
} 

답변

6

참조 Microsoft.Extensions.DependencyInjection 패키지 및 작성 범위는 :

var services = new ServiceCollection(); 
services.AddScoped<ExampleService>(); 
var globalProvider = services.BuildServiceProvider(); 

using (var scope = globalProvider.CreateScope()) 
{ 
    var localScoped = scope.ServiceProvider.GetService<ExampleService>(); 

    var globalScoped = globalProvider.GetService<ExampleService>(); 
} 

당신은 쉽게뿐만 아니라 그것을 테스트 할 수

using (var scope = globalProvider.CreateScope()) 
{ 
    var localScopedV1 = scope.ServiceProvider.GetService<ExampleService>(); 
    var localScopedV2 = scope.ServiceProvider.GetService<ExampleService>(); 
    Assert.Equal(localScopedV1, localScopedV2); 

    var globalScoped = globalProvider.GetService<ExampleService>(); 
    Assert.NotEqual(localScopedV1, globalScoped); 
    Assert.NotEqual(localScopedV2, globalScoped); 
} 

문서 : Service Lifetimes and Registration Options합니다.

+0

정말 내 의사 코드로 대답에 가까웠습니다. 고맙습니다! – x2bool

관련 문제