Dependency injection Kephas中AmbientServices和CompositionContext之间的区别是什么?

Dependency injection Kephas中AmbientServices和CompositionContext之间的区别是什么?,dependency-injection,kephas,Dependency Injection,Kephas,从我注意到的情况来看,他们做了几乎相同的事情,以IoC/DI的形式提供服务。但是,IAmbientServices具有类型为ICompositionContext的成员。我真的不明白它们之间的区别,为什么它们以这种方式聚合?简明的回答是:环境服务包含在构建IoC/DI/合成容器之前注册的服务,而合成上下文是IoC/DI的根容器,并且本身是注册到环境服务中的服务 作为旁注,在环境服务中注册的所有服务稍后也会自动注册到DI容器中,包括IAmbientServices,因此它们也可用于合成 环境服务示

从我注意到的情况来看,他们做了几乎相同的事情,以IoC/DI的形式提供服务。但是,
IAmbientServices
具有类型为
ICompositionContext
的成员。我真的不明白它们之间的区别,为什么它们以这种方式聚合?

简明的回答是:
环境服务
包含在构建IoC/DI/合成容器之前注册的服务,而
合成上下文
是IoC/DI的根容器,并且本身是注册到
环境服务
中的服务

作为旁注,在
环境服务
中注册的所有服务稍后也会自动注册到DI容器中,包括
IAmbientServices
,因此它们也可用于合成

环境服务示例:

  • 日志管理器:记录器的提供者
  • 类型加载器:从程序集加载类型
  • 配置存储:提供主配置设置

一般来说,您更喜欢使用在DI容器中注册的服务,您将很少需要环境服务。

是否有理由使用类似于环境服务的容器,而不是简单地使用某种静态变量?我的意思是这样的环境服务必须只有几个。使用
IAmbientServices
而不是静态变量有更多的理由:1。利用单元测试;2.为应用程序根服务提供一个中央注册中心,即使它们不是那么多;3.可通过合成获得,通常不建议直接使用;4.除了作为服务注册中心,它还是一个expando对象,可以在运行时动态扩展;5.
AmbientServices.Instance
属于
IAmbientServices
类型,可以在引导时进行设置,因此您可以完全控制其背后的内容:)。