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获取到,但可以通过 构造函数的方式获取
这是什么原因??