Пользовательский 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, но я действительно хотел сохранить родной двигатель, который казался мне действительно легким весом.