让我们考虑在 Startup.ConfigureServices
中进行服务注册:
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IFoo, FooA>();
}
在调用 AddTransient
后,是否可以更改 IFoo
的注册到 FooB
?这样做可能对测试有所帮助(例如,在 TestStartup
子类中),或者如果我们对代码库的访问受到限制。
如果我们注册了另一个 IFoo
实现:
services.AddTransient<IFoo, FooA>();
services.AddTransient<IFoo, FooB>();
然后,GetService<IFoo>
返回 FooB
而不是 FooA
:
IFoo service = services.BuildServiceProvider().GetService<IFoo>();
Assert.True(service is FooB);
然而,GetServices<IFoo>
成功返回两个实现(对于 GetService<IEnumerable<IFoo>>
同样如此):
var list = services.BuildServiceProvider().GetServices<IFoo>().ToList();
Assert.Equal(2, list.Count);
IServiceCollection
合同中有一个Remove(ServiceDescriptor)
方法。 我应该如何处理ServiceDescriptor
以修改服务注册?
services.Replace(ServiceDescriptor.Transient<IFoo, FooB>());
- Kolkyservices.Replace(ServiceDescriptor.Transient<IFoo>(_ => yourInstance));
- DonSleza4e