ASP.NETCore内置DI容器替换服务注册?让我们考虑Startup.ConfigureServices的服务注册:publicvoidConfigureServices(IServiceCollectionservices){services.AddTransient();是否可以在调用FooB后将IFoo注册更改为FooB?它有助于测试目的(例如,在TestStartup子类中)或者如果我们对代码库的访问受到限制。如果我们注册另一个IFoo实现:services.AddTransient();服务.AddTransient();然后GetService返回FooB而不是FooA:IFooservice=services.BuildServiceProvider().GetService();Assert.True(服务是FooB);但是,GetServices成功返回两个实现(对于GetService):varlist=services.BuildServiceProvider().GetServices().ToList();Assert.Equal(2,list.Count);IServiceCollection合同具有Remove(ServiceDescriptor)方法。应该如何使用ServiceDescriptor修改服务注册?在ServiceCollectionDescriptorExtensions类中使用Replace(IServiceCollection,ServiceDescriptor)方法很简单。//IFoo->FooAservices.AddTransient();//替换//IFoo->FooBvardescriptor=newServiceDescriptor(typeof(IFoo),typeof(FooB),ServiceLifetime.Transient);服务。替换(描述符);还可以看看:如果您知道两个简单的事情,ASP.NETCoreDIfunction很容易覆盖:1.ServiceCollection只是List的包装器:publicclassServiceCollection:IServiceCollection{privateList_descriptors=newList();}2.当注册一个服务时,一个新的描述符会被添加到列表中:collection.Add(描述符);退货收集;因此可以从这个列表中添加/删除描述符以替换注册:IFooservice=services.BuildServiceProvider().GetService();Assert.True(服务是FooA);var描述符=服务。FirstOrDefault(d=>d.ServiceType==typeof(IFoo));Assert.NotNull(描述符);服务。删除(描述符);服务=服务.BuildSearchrviceProvider().GetService();断言(服务);我们使用Replace方法来完成:services.Replace(ServiceLifetime.Transient);其实现:以上是C#学习教程:替换ASP.NETCore内置DI容器服务注册?如果分享的内容对你有用,需要了解更多C#学习教程,希望你多多关注——,TService{vardescriptorToRemove=services.FirstOrDefault(d=>d.ServiceType==typeof(TService));services.Remove(descriptorToRemove);vardescriptorToAdd=newServiceDescriptor(typeof(TService),typeof(TImplementation),lifetime);services.Add(descriptorToAdd);退货服务;}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: