I'm working on an ASP .NET Core app with a DI setup, and I've encountered an issue related to dependency references that are not behaving as expected.
I have a series of services and interfaces that use Singleton registration in the DI container. Specifically, I have a WeatherService and a child class CurrentWeatherService that inherits from WeatherService. Both services are registered as Singletons.
Here's the simplified setup in my program:
services.AddSingleton<IWeatherService, WeatherService>();
services.AddSingleton<ICurrentWeatherService, CurrentWeatherService>();
Now, when I access WeatherService directly and also via CurrentWeatherService using the base keyword, I notice that they are not referencing the same instance, despite being registered as Singleton. What might be causing this issue? I would like them to share the same instance.
Here's the basic structure of my classes:
public class WeatherService : IWeatherService
{
/******/
protected virtual async Task<T> GetWeatherDataAsync<T>(string endpoint) where T : class
{
/******/
}
}
public class CurrentWeatherService : WeatherService, ICurrentWeatherService
{
/******/
protected override async Task<T> GetWeatherDataAsync<T>(string endpoint)
{
return await base.GetWeatherDataAsync<T>(endpoint);
}
}
Is there something in my Dependency Injection setup that I might be missing or any known .NET Core behaviour that could explain this?
Any insights or suggestions would be greatly appreciated.
You don't use DI. Instead you use inheritance. To use DI you should rewrite your current weather service implementation:
public class CurrentWeatherService : ICurrentWeatherService
{
private readonly IWeatherService _weatherService;
public CurrentWeatherService(IWeatherService weatherService)
{
_weatherService = weatherService
?? throw new ArgumentNullException(nameof(weatherService));
}
public async Task<T> GetWeatherDataAsync<T>(string endpoint)
{
return await _weatherService.GetWeatherDataAsync<T>(endpoint);
}
}