在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完全替换原生的,并且每次都被称为。
我错过了什么吗?
答案 0 :(得分:0)
好的,我刚检查了源代码(我应该在发布问题之前检查一下对不起)。 https://github.com/aspnet/DependencyInjection/blob/master/src/Microsoft.Extensions.DependencyInjection/ServiceProvider.cs
构建方法本身添加了具有本机实例的IServiceProvider类型。 由于似乎无法正确修改它(没有反映“_table”字段,我的意思是:-)。在我看来,这种方法显然不是很好。
我想我会尝试其他依赖注入引擎,比如Autofac,但我真的想保留原本看起来很轻的原生引擎。