Browse Source

Use IServiceScopeFactory to resolve service due to dispose problem

pull/24305/head
berkansasmaz 9 months ago
parent
commit
455e2cb2c5
  1. 36
      framework/src/Volo.Abp.Core/Volo/Abp/Internal/Telemetry/TelemetryService.cs

36
framework/src/Volo.Abp.Core/Volo/Abp/Internal/Telemetry/TelemetryService.cs

@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Internal.Telemetry.Activity.Contracts;
using Volo.Abp.Internal.Telemetry.Constants;
@ -11,17 +12,11 @@ namespace Volo.Abp.Internal.Telemetry;
public class TelemetryService : ITelemetryService, IScopedDependency
{
private readonly ITelemetryActivitySender _telemetryActivitySender;
private readonly ITelemetryActivityEventBuilder _telemetryActivityEventBuilder;
private readonly ITelemetryActivityStorage _telemetryActivityStorage;
private readonly IServiceScopeFactory _serviceScopeFactory;
public TelemetryService(ITelemetryActivitySender telemetryActivitySender,
ITelemetryActivityEventBuilder telemetryActivityEventBuilder,
ITelemetryActivityStorage telemetryActivityStorage)
public TelemetryService(IServiceScopeFactory serviceScopeFactory)
{
_telemetryActivitySender = telemetryActivitySender;
_telemetryActivityEventBuilder = telemetryActivityEventBuilder;
_telemetryActivityStorage = telemetryActivityStorage;
_serviceScopeFactory = serviceScopeFactory;
}
@ -74,24 +69,37 @@ public class TelemetryService : ITelemetryService, IScopedDependency
{
_ = Task.Run(async () =>
{
await BuildAndSendActivityAsync(context);
using var scope = _serviceScopeFactory.CreateScope();
var telemetryActivityEventBuilder = scope.ServiceProvider.GetRequiredService<ITelemetryActivityEventBuilder>();
var telemetryActivityStorage = scope.ServiceProvider.GetRequiredService<ITelemetryActivityStorage>();
var telemetryActivitySender = scope.ServiceProvider.GetRequiredService<ITelemetryActivitySender>();
await BuildAndSendActivityAsync(context,
telemetryActivityEventBuilder,
telemetryActivityStorage,
telemetryActivitySender);
});
return Task.CompletedTask;
}
private async Task BuildAndSendActivityAsync(ActivityContext context)
private static async Task BuildAndSendActivityAsync(
ActivityContext context,
ITelemetryActivityEventBuilder telemetryActivityEventBuilder,
ITelemetryActivityStorage telemetryActivityStorage,
ITelemetryActivitySender telemetryActivitySender)
{
try
{
var activityEvent = await _telemetryActivityEventBuilder.BuildAsync(context);
var activityEvent = await telemetryActivityEventBuilder.BuildAsync(context);
if (activityEvent is null)
{
return;
}
_telemetryActivityStorage.SaveActivity(activityEvent);
await _telemetryActivitySender.TrySendQueuedActivitiesAsync();
telemetryActivityStorage.SaveActivity(activityEvent);
await telemetryActivitySender.TrySendQueuedActivitiesAsync();
}
catch
{

Loading…
Cancel
Save