C# 容器的等价物是什么。RegisterInstance<;伊瑟维西娅>;(国际奥委会决议<;IServiceB>;());在.NET Core的依赖项注入容器中?

C# 容器的等价物是什么。RegisterInstance<;伊瑟维西娅>;(国际奥委会决议<;IServiceB>;());在.NET Core的依赖项注入容器中?,c#,dependency-injection,.net-core,unity-container,C#,Dependency Injection,.net Core,Unity Container,我正在将.NET Windows服务迁移到.NET核心控制台应用程序。我想使用.NETCore的开箱即用依赖注入,而不是unity 我在将这行代码转换为.NET Core DI时遇到了障碍: container.RegisterInstance<IServiceA>(IoC.Resolve<IServiceB>()); serviceCollection.AddScoped<IServiceB, SomeService>(); container.Regi

我正在将.NET Windows服务迁移到.NET核心控制台应用程序。我想使用.NETCore的开箱即用依赖注入,而不是unity

我在将这行代码转换为.NET Core DI时遇到了障碍:

container.RegisterInstance<IServiceA>(IoC.Resolve<IServiceB>());
serviceCollection.AddScoped<IServiceB, SomeService>();

container.RegisterInstance(IoC.Resolve());
IServiceB之前已在Unity注册为:

container.RegisterType<IServiceB, SomeService>(new ContainerControlledLifetimeManager());
container.RegisterType(新ContainerControlledLifetimeManager());
IServiceB已在NET Core DI中注册为:

container.RegisterInstance<IServiceA>(IoC.Resolve<IServiceB>());
serviceCollection.AddScoped<IServiceB, SomeService>();
serviceCollection.addScope();
据我所知,container.RegisterInstance(IoC.Resolve());将IServiceA映射到某个服务是否正确?像这样,一些服务可以同时映射到IServiceA和IServiceB。还是我理解错了什么

所以,我试过这样的方法:

var x = serviceProvider.GetServices<IServiceB>().First(o => o.GetType() == typeof(IServiceA));
serviceCollection.AddScoped<IServiceA, x>();
var x=serviceProvider.GetServices().First(o=>o.GetType()==typeof(IServiceA));
serviceCollection.addScope();
然而,我得到了一个错误:“x是一个变量,但它的使用方式与类型类似。”


我应该如何翻译它?

您可以将工厂lambda传递给
AddScoped
扩展,如下所示:


servicecolection.AddScoped(s=>s.GetService())

为什么有
serviceProvider
?当然,你应该在从serviceCollection中构建它之后才拥有它?我不知道,John,谢谢你揭示了这一点。这可以解释为什么我在使用serviceProvider的其他行中有空异常。谢谢。
container.RegisterInstance(IoC.Resolve())一开始是个非常糟糕的主意。有一个原因,像Autofac和MS.DI这样的容器将注册阶段分开,而像Simple Injector这样的容器在第一次解析后锁定容器。例如,read,它描述了执行此操作时的问题。这种描述与容器无关。请注意,执行
container.Register(container.Resolve)
与@zaitman的回答是完全不同的模式,后者将解析延迟到注册阶段之后。