C# 如何创建IServiceCollection中AddScope/Transient/Singleton中的服务提供者?Can';t解析以前添加的服务
我正在向IServiceCollection添加服务。我想使用一个已在factory方法中添加到集合中的服务作为另一个服务。 使用AddScoped(可能与C# 如何创建IServiceCollection中AddScope/Transient/Singleton中的服务提供者?Can';t解析以前添加的服务,c#,.net-core,C#,.net Core,我正在向IServiceCollection添加服务。我想使用一个已在factory方法中添加到集合中的服务作为另一个服务。 使用AddScoped(可能与AddTransient和AddSingleton相同,但我使用Scoped)方法提供Func作为参数,IServiceProvider无法解析已添加到IServiceCollection的服务 如前所述,我最初尝试使用自动提供到该方法中的IServiceProvider来使用implementationFactory方法。当试图解析我在代码
AddTransient
和AddSingleton
相同,但我使用Scoped)方法提供Func
作为参数,IServiceProvider
无法解析已添加到IServiceCollection
的服务
如前所述,我最初尝试使用自动提供到该方法中的IServiceProvider
来使用implementationFactory
方法。当试图解析我在代码中已注册的较高级别的服务时,此IServiceProvider
引发异常
在搜索了一段时间后,我在IServiceCollection
-BuildServiceProvider()
上发现了一个扩展方法。使用此方法生成的服务提供程序可以成功解析服务。那么,这与传递到实现工厂方法的IServiceProvider有什么不同呢
//下面的代码在尝试解析时引发异常。
//注意,它成功地解析了接口
public void配置服务(IServiceCollection服务)
{
services.addScope();
AddScoped(typeof(ISomeGeneric),typeof(SomeGeneric));
services.AddScoped(serviceProvider=>newthingtoresolve(serviceProvider.GetRequiredService(),serviceProvider.GetRequiredService());
}
//下面是我最终实现的解决方案
public void配置服务(IServiceCollection服务)
{
services.addScope();
AddScoped(typeof(ISomeGeneric),typeof(SomeGeneric));
var serviceProvider=services.BuildServiceProvider();
services.AddScoped(spThatIsNotUsed=>newThingToResolve(serviceProvider.GetRequiredService(),serviceProvider.GetRequiredService());
}
引发的错误是无法从根提供程序解析作用域服务“ISomeGeneric`1[SomeType]”。
如上所述,即使使用此方法,
ISomeInterface
服务也会被解析,因此我无法理解为什么我的所有服务都不包含在此服务提供商中为什么使用services.AddScoped();
而不是services.AddScoped())
其中SomeImplementation
实现ISomeInterface
?感谢您指出这一点,这只是问题中的一个错误。现在编辑services.AddScoped(typeof(ISomeGeneric),typeof(SomeGeneric);
看起来末尾缺少一个括号。