自定义 IServicePovider 并不总是被使用

Custom IServicePovider is not always used

在 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,生命周期为 "singleton"(太棒了!!) 但是,此后不再调用它,而是调用默认的 ServiceProvider ... 顺便说一句,如果我请求IServiceProvider的解析,这是我得到的原生的。

我希望我的 serviceProvider 完全替换原生的,并且每次都被调用。

我是不是漏掉了什么??

好的,我刚刚检查了源代码(我应该在发布问题之前检查一下抱歉)。 https://github.com/aspnet/DependencyInjection/blob/master/src/Microsoft.Extensions.DependencyInjection/ServiceProvider.cs

构建方法通过自身添加带有本机实例的 IServiceProvider 类型。 因为似乎没有办法正确修改它(我的意思是没有反映“_table”字段:-)。在我看来,这种做法显然不好。

我想我会尝试其他依赖注入引擎,例如 Autofac,但我真的想保持在我看来非常轻量级的本机引擎。