.NET Core 3.1依赖注入下不使用BuildServiceProvider获取单例返回值咨询
可行实现方案
方案1:使用工厂模式注册后续依赖服务(最推荐)
无需在ConfigureServices阶段提前解析ConfigurationDataClass实例,直接将后续服务的注册改为DI工厂重载,依赖解析由容器自动处理,完全不会生成额外容器:
// 原有ConfigurationDataClass注册逻辑保留 services.AddSingleton((sp) => { var svc = sp.GetRequiredService<Dependency_A>(); var setConfig = new ConfigurationDataClass(svc); setConfig = setConfig.CallMethod().Result; return setConfig; }); // 后续依赖OtherData的服务改用工厂模式注册 services.AddSingleton<IDependentService>(sp => { // 容器会自动保证先完成ConfigurationDataClass的初始化再解析 var config = sp.GetRequiredService<ConfigurationDataClass>(); // 直接取OtherData传递给服务构造函数 return new DependentService(config.OtherData); });
该方案完全符合.NET DI设计规范,无额外开销,适配绝大多数场景。
方案2:提前同步初始化配置实例
如果Dependency_A的所有依赖都可以在ConfigureServices阶段直接获取(无需依赖其他DI注册的服务),可以提前完成配置初始化,直接注册实例:
// 直接构造Dependency_A,比如仅依赖IConfiguration,Startup中默认可直接访问Configuration属性 var dependencyA = new Dependency_A(Configuration); var setConfig = new ConfigurationDataClass(dependencyA); setConfig = setConfig.CallMethod().GetAwaiter().GetResult(); // 直接注册已初始化完成的实例 services.AddSingleton(setConfig); // 此时可直接读取setConfig.OtherData,任意用于后续服务注册逻辑 services.AddSingleton<IDependentService>(new DependentService(setConfig.OtherData));
注意该方案仅适用于Dependency_A无复杂DI依赖的场景。
方案3:通过Options模式传递配置
如果后续服务适配Options模式,可以通过DI内置的配置回调传递数据,无需提前解析实例:
// 注册Options配置,依赖会由容器自动注入 services.AddOptions<DependentServiceOptions>() .Configure<ConfigurationDataClass>((options, config) => { options.OtherData = config.OtherData; }); // 后续服务只要注入IOptions<DependentServiceOptions>即可获取对应数据
注意事项
原有代码中使用.Result同步阻塞异步方法存在死锁风险,建议将CallMethod改为同步实现,或使用.GetAwaiter().GetResult()降低死锁概率。
内容的提问来源于stack exchange,提问作者JustinTime
相关产品推荐
相关产品推荐

