自定义 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,但我真的想保持在我看来非常轻量级的本机引擎。
在 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,但我真的想保持在我看来非常轻量级的本机引擎。