728x90
ServiceCollection 의 DI를 이용하여 클래스의 객체를 생성하고 그 객체의 클래스가 IDisposable 을 상속하여,
프로그램이 종료 또는 인스턴스가 종료될 때 Dispose 함수가 자동으로 호출되게 하기 위해서는 DI 컨테이너가
해당 서비스가 IDisposable을 구현해야 되는지를 명시적으로 등록해야 한다.
이를 위한 예제는 아래와 같다.
using Microsoft.Extensions.DependencyInjection;
using System;
public interface ITrackedDownloadService
{
void TrackDownload(string url);
}
public class TrackedDownloadService : ITrackedDownloadService, IDisposable
{
public void TrackDownload(string url)
{
Console.WriteLine($"Tracking download for: {url}");
}
public void Dispose()
{
// Dispose logic here
Console.WriteLine("TrackedDownloadService disposed.");
}
}
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
// 기본 서비스 등록
services.AddSingleton<ITrackedDownloadService, TrackedDownloadService>();
// 팩토리 메서드를 사용한 IDisposable 등록
services.AddSingleton<IDisposable>(provider => provider.GetRequiredService<ITrackedDownloadService>());
}
}
class Program
{
static void Main(string[] args)
{
var serviceCollection = new ServiceCollection();
var startup = new Startup();
startup.ConfigureServices(serviceCollection);
var serviceProvider = serviceCollection.BuildServiceProvider();
// 서비스 사용
var downloadService = serviceProvider.GetRequiredService<ITrackedDownloadService>();
downloadService.TrackDownload("http://example.com/file");
// Dispose 호출을 트리거링
if (serviceProvider is IDisposable disposable)
{
disposable.Dispose();
}
}
}
먼저 원하는 서비스의 인스턴스를 인터페이스에 연결하여 서비스를 등록한다.
services.AddSingleton<ITrackedDownloadService, TrackedDownloadService>();
그 뒤에 IDisposable 에 대해서는 팩토리 메소드 방식을 이용해서 IDisposable 서비스를 등록한다
services.AddSingleton<IDisposable>(provider => provider.GetRequiredService<ITrackedDownloadService>());
728x90
728x90