代码改变世界

记录一次失败的 AddScoped 未能获取到对象?未解决

2020-11-26 11:30  石吴玉  阅读(513)  评论(0编辑  收藏  举报

1.在程序中定义一个静态类 SdkBootstrap,类中定义静态对象:ServiceProvider

    public static class SdkBootstrap
    {
        public static IServiceProvider ServiceProvider { get; set; }

        /// <summary>
        /// 在.net core中使用,在Startup 类中的 ConfigureServices()方法中调用此方法,注入一些 对象到 服务中
        /// </summary>
        /// <param name="services"></param>
        /// <param name="sdkAction">sdk功能初始化</param>
        /// <param name="action">附加操作</param>
        public static void AddOpenApiSdk(this IServiceCollection services, Action<SdkOption> sdkAction,Action action=null)
        {
            services.AddSingleton<AdapterDbContext>();

            services.AddScoped<MemoryCache>();
            services.AddScoped<ICustomerMemoryCache, MemoryCacheUtil>();

            //InitSdk(services, sdkAction, action);

            #region HttpClientFactory
            services.AddHttpClient();

            services.AddSingleton<HttpHelper>();
            #endregion
        }
        //在 Startup类的 Configure 方法中调用 此方法,把 系统的 IApplicationBuilder赋值给 SdkBootstrap.ServiceProvider
        public static void UseOpenApiSdk(this IApplicationBuilder app)
        {
            ServiceProvider = app.ApplicationServices;
            //在此处为 Logger赋值(ILogger是在program中注入到服务的)
            SdkConfig.Logger = ServiceProvider.GetService<ILogger>();
        }
    }

注意:系统启动时,在服务中注入了  ICustomerMemoryCache

 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
       app.UseOpenApiSdk();
}

在 Controller中使用  ICustomerMemoryCache 对象

情景一:

注入方式:services.AddScoped<ICustomerMemoryCache, MemoryCacheUtil>();

             获取方式:private static ICustomerMemoryCache memoryCache = SdkBootstrap.ServiceProvider.GetService<ICustomerMemoryCache>();

             获取失败!!!

            可获取方式:     

public OpenApiController()
{
        using(var a = SdkBootstrap.ServiceProvider.CreateScope())
        {
                var c = a.ServiceProvider.GetService<ICustomerMemoryCache>();
        }
}

 

情景二:

注入方式:services.AddScoped<ICustomerMemoryCache, MemoryCacheUtil>();

              获取方式:        

        public OpenApiController(ICustomerMemoryCache _memoryCache)
        {
            memoryCache = _memoryCache;
        }

        获取成功!!!

           

情景三:

注入方式:services.AddSingleton<ICustomerMemoryCache, MemoryCacheUtil>();

              获取方式:   private static ICustomerMemoryCache memoryCache = SdkBootstrap.ServiceProvider.GetService<ICustomerMemoryCache>();

             获取成功!!!

 

???疑问:当注入方式为 AddSingleton时,可以通过静态对象  SdkBootstrap.ServiceProvider 获取到,但是当 注入方式为:AddScoped 时,无法通过 SdkBootstrap.ServiceProvider获取到,但可以通过 构造函数的方式获取

这是什么原因??