依赖是如何解析的

Windsor 中的组件很少是独立的。毕竟,Windsor 最主要的任务是查找和管理依赖。如果组件有一些依赖,Windsor 通过几个步骤来解析它们。

依赖解析器(Dependency Resolver)

Windsor 使用依赖解析器(实现 IDependencyResolver 接口的类型)解析组件的依赖。默认依赖解析器 (DefaultDependencyResolver 类)检查以下几个地方以解析依赖。

创建上下文(Creation Context)

首先依赖解析器为依赖调用 CreationContext 。 创建上下文首先尝试用名称解析依赖,然后通过使用内联提供的依赖的类型, 也就是说,它来自于以下任何一种情况:

  1. 传递给 Resolve 的参数: container.Resolve<IFoo>(new Arguments(new { inlineDependency = "its value" }));
  2. 通过 Fluent 注册 API 的方法 DynamicParameters 传递的参数。

:information_source: 其他来源: 注意 强类型工厂设施 转发工厂方法传递的参数作为内联参数。

处理器

如果没有内联参数能够满足依赖,解析器询问处理器是否能够满足。处理器首先尝试通过名字解析依赖,然后通过类型。值来自 ComponentModelCustomDependencies 集合,这通常是传递给DependsOn方法的参数。

  1. kernel.Register(Component.For<ClassWithArguments>()
  2. .DependsOn(
  3. Property.ForKey<string>().Eq("typed"),
  4. Property.ForKey<int>().Eq(2)
  5. )
  6. );

子解析器(Subresolvers)

如果上面那些地方都不能解析依赖,解析器询问它的每一个子解析器(实现(ISubDependencyResolver))是否能够提供依赖。

核心(Kernel)

如果上面那些都不能解析依赖,容器尝试自己解析。根据依赖的类型,容器尝试下面的步骤:

  • 对于参数依赖,容器尝试检查 ComponentModelParameters 集合以匹配依赖。包括 XML 提供的参数,或通过 Fluent API 的 Parameters 方法传递的参数。
  • 对于 service override dependency,容器尝试通过指定关键字匹配组件。
  • 对于服务依赖,容器将会尝试通过指定关键字匹配任意一个组件。

如果上面都不行,抛出DependencyResolverException异常。

还可以看看