zoukankan      html  css  js  c++  java
  • 记录一次失败的 AddScoped 未能获取到对象?未解决

    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获取到,但可以通过 构造函数的方式获取

    这是什么原因??

  • 相关阅读:
    P1744 采购特价商品
    P1359 租用游艇
    P3092 [USACO13NOV]没有找零No Change
    P1272 重建道路
    P2014 选课
    P1026 统计单词个数
    P1776 宝物筛选_NOI导刊2010提高(02)
    自定义异步非阻塞tornado框架
    tornado进阶篇
    tornado基础篇
  • 原文地址:https://www.cnblogs.com/yxcn/p/14041407.html
Copyright © 2011-2022 走看看