Пользовательский IServicePovider не всегда используется

В файле startup.cs я хочу определить расширенный ServiceProvider: он в основном оборачивает реализацию по умолчанию IServiceProvider.

public IServiceProvider ConfigureServices(IServiceCollection services)
{
   [...]
   var servicesProvider = services.BuildExtendedServiceProvider();
   return servicesProvider;
}

Вот основная реализация расширенного поставщика услуг

/// <summary>
/// Extends the native asp.net service provider 
/// </summary>
public class ExtendedServicesProvider : IServiceProvider
{
    private readonly IServiceProvider _serviceProvider;

    /// <summary>
    /// Creates a new instance of <see cref="ExtendedServicesProvider"/> provider based on the native mvc <see cref="IServiceProvider"/>
    /// </summary>
    /// <param name="serviceProvider"></param>
    public ExtendedServicesProvider(IServiceProvider serviceProvider)
    {
        _serviceProvider = serviceProvider;
    }

    /// <inheritDoc />
    public object GetService(Type serviceType)
    {
        var resolvedService = _serviceProvider.GetService(serviceType);
        [...]
        return resolvedService;
    }
}

При запуске я вижу, что GetService вызывается для каждого сервиса с "синглтоном" времени жизни (отлично!!). Однако после этого он больше не вызывается, а вместо этого вызывается ServiceProvider по умолчанию... Кстати, если я запросить разрешение IServiceProvider, это родной, который я получаю.

Я бы хотел, чтобы мой сервис-провайдер полностью заменил свой родной и назывался КАЖДЫЙ раз.

Я что-то пропустил??

1 ответ

Решение

Хорошо, я только что проверил исходный код (я должен был проверить, прежде чем отправлять вопрос извините). https://github.com/aspnet/DependencyInjection/blob/master/src/Microsoft.Extensions.DependencyInjection/ServiceProvider.cs

Метод сборки сам добавляет тип IServiceProvider с собственным экземпляром. Так как, похоже, нет возможности изменить его должным образом (без отражения в поле "_table" я имею в виду:-). Мне кажется, что подход явно не хороший.

Я думаю, что я попробую другие двигатели впрыска зависимости, такие как Autofac, но я действительно хотел сохранить родной двигатель, который казался мне действительно легким весом.

Другие вопросы по тегам