【问题标题】:Custom IServicePovider is not always used并不总是使用自定义 IServicePovider
【发布时间】:2017-01-15 02:58:58
【问题描述】:

在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 完全替换本地的,并且每次都被调用。

我错过了什么吗??

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-05-29
      • 2017-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-24
      • 2011-12-17
      • 1970-01-01
      相关资源
      最近更新 更多