5

Ich baue eine Konsole .NET Core-Anwendung. Es führt regelmäßig eine Methode aus, die etwas Arbeit leistet. Wie kann ich ServiceProvider so verhalten, wie er sich in ASP.NET Core-Apps verhält? Ich möchte, dass die Bereichsdienste aufgelöst werden, wenn die Methode mit der Ausführung beginnt, und die aufgelösten Dienste am Ende der Methode verfügbar sind.Wie erstellt man einen untergeordneten Bereich von dem Eltern mit Standard-Abhängigkeitsinjektion in .NET Core?

// pseudocode 

globalProvider.AddScoped<ExampleService>(); 

// ... 

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

Antwort

6

Referenz Microsoft.Extensions.DependencyInjection Paket und erstellen Bereiche:

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>(); 
} 

Sie können es leicht auch testen:

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); 
} 

Dokumentation: Service Lifetimes and Registration Options.

+0

Ich war wirklich nah an der Antwort mit meinem Pseudocode. Vielen Dank! – x2bool

Verwandte Themen