在MS.DI中没有办法覆盖或禁用该行为,据我所知,在中的任何其他DI容器中也没有此类功能。网络生态系统。
但是,您可以做的是在服务提供商构建后立即解决该实例:
provider.GetRequiredService<ILocalizationService>();
这将构造该实例并运行其构造函数。
一些DI容器提供者提供了一种“验证”机制,可以通过创建注册来测试所有注册。然而,在迪女士身上不存在这样的特征。
但是,我建议移动初始化,而不是在类的构造函数中进行这种“缓慢运行的工作”
出来
并转换为一个
Init
某种方法,因为
Injection Constructors should be simple
除了存储其依赖项之外,不应该做任何工作。还要注意的是,如果您希望在将来使这个繁重的操作异步化,您肯定会运气不佳,因为这不可能使构造函数异步化(请参阅)
this
,
this
和
this
,以获取更多信息)。
相反,将逻辑从构造函数移到
初始化
某种方法,例如:
public class LocalizationService : ILocalizationService
{
private readonly IDependency1 dep1;
private readonly IDependency2 dep2;
public LocalizationService(IDependency1 dep1, IDependency2 dep2)
{
// Just pre-condition checks and storing dependencies.
// Never use injected dependencies inside the constructor.
this.dep1 = dep1 ?? throw new ArgumentNullException();
this.dep2 = dep2 ?? throw new ArgumentNullException();
}
public void Init() => /* Do heavy initialization here */
public Task InitAsync() => /* Or do async initialization here */
}
这可以让你解决问题
LocalizationService
从
ServiceProvider
在startsup,并呼叫
初始化
方法:
var service = provider.GetRequiredService<LocalizationService>();
// Forces initialization at startup
service.Init();
// or
await service.InitAsync();
这需要
本地化服务
也要注册,就在它的旁边
ILocalizationService
接口:
services.AddSingleton<LocalizationService>();
services.AddSingleton<ILocalizationService>(c =>
c.GetRequiredService<LocalizationService>>();
最后一次注册有点偷偷摸摸,但它允许两次注册
iLocalization服务
和
本地化服务
指向完全相同的实例。