并不总是使用自定义IServicePovider

时间:2016-09-07 12:07:49

标签: dependency-injection asp.net-core .net-core

在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的解析,这是我得到的本地解析。

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

我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

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

构建方法本身添加了具有本机实例的IServiceProvider类型。 由于似乎无法正确修改它(没有反映“_table”字段,我的意思是:-)。在我看来,这种方法显然不是很好。

我想我会尝试其他依赖注入引擎,比如Autofac,但我真的想保留原本看起来很轻的原生引擎。