免费建外贸网站,企业网站建设和网络营销的关系,固定链接 wordpress,百度商家怎么入驻【导读】最近重构部分代码#xff0c;因历史原因在静态类中需使用注入实例#xff0c;构造函数注入则不再可取#xff0c;此时只能构造全局IServiceProvider#xff0c;所以本文稍微分析下IServiceProvider要构造全局使用IServiceProvider#xff0c;我们都知道不能在Conf… 【导读】最近重构部分代码因历史原因在静态类中需使用注入实例构造函数注入则不再可取此时只能构造全局IServiceProvider所以本文稍微分析下IServiceProvider要构造全局使用IServiceProvider我们都知道不能在ConfigureServices方法中直接调用BuildServideProvider而获取会提示引起额外的复制等等问题这里就不用多说 。构造全局IServiceProvider首先我们给出对应接口以及具体实现public interface IHelloService
{void SayHello();
}public class HelloService : IHelloService
{public void SayHello(){Console.WriteLine(Hello);}
}
接着我们将其注入为单例形式services.AddSingletonIHelloService, HelloService();
最后我们在Configure方法中获取注入实例并调用实例方法如下
var serviceProvider app.ApplicationServices;var service serviceProvider.GetRequiredServiceIHelloService();
service.SayHello();
看上述调用结果没有任何毛病接下来我们将其注入生命周期修改为Scope看看此时将抛出如上异常这里我将具体详细信息给出如下Cannot resolve scoped service ... from root provider要是我们将生命周期修改为Transient那么结果和Singleton一样可正常调用。看到上述异常信息网上部分资料并没有说明根本原因只是给出如下解决方案
serviceCollection.BuildServiceProvider(validateScopes: false);
接下来我们依然保持上述生命周期Scope不变我们在Configure方法中传入IServiceProvider参数结果会怎样呢此时我们将发现结果却能正常调用并不会如上述使用属性而抛出异常这二者到底有何区别依稀记得在使用.NET Core 2.x版本时也遇到过这问题当时也是想都没想直接进行如上配置大方的解决了问题。那么为何进行如上设置就可以了呢抛异常的根本原因在哪里这是因为通过属性获取的是根部的IServiceProvider即root IServiceProvider而上述以方法参数传入的则是根部的孩子child of the root。通过看这一块源码可通过如下代码来证明参数所传入的IServiceProvider的根部就是app.ApplicationServices((Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope)serviceProvider).Engine.Root
如下为上述类截图源码由于上述类属于程序集内并未对外暴露所以想要验证的童鞋可能只能下载依赖注入这块源码去验证才可分析到这里想必我们已经明了只能通过IServiceProvider子级才能解析注入的Scope实例因此要从根本上解决通过属性去获取到注入Scope实例我们还需手动创建子级才可如下var manualScope app.ApplicationServices.CreateScope();var service manualScope.ServiceProvider.GetRequiredServiceIHelloService();
service.SayHello();???? 属性获取的是根部的IServiceProvider即root IServiceProvider而以方法参数传入的则是根部的孩子child of the root。???? 属性需创建子级IServiceProvider才可解析Scope服务