Castle Windsor中文文档 - 如何解析依赖

如何解析依赖

Windsor的组件很少独立。毕竟,Windsor的主要任务之一是连接和管理依赖。当一个组件有一些依赖时,Windsor会经过几个步骤来解析它们。

依赖解析器(Dependency Resolver)

Windsor使用依赖解析器(实现IDependencyResolver接口的类型)来解析你的组件的依赖。默认依赖解析器(DefaultDependencyResolver类)查找以下位置以解决依赖。

创建上下文(Creation Context)

首先,依赖解析器请求CreationContext解析依赖。CreationContext尝试首先按名称解析依赖项,然后通过使用内联提供的依赖项来解析依赖。这意味着,它来自以下任何一个:

  1. Arguments passed to Resolve: container.Resolve<IFoo>(new Arguments(new { inlineDependency = "its value" }));
  2. Arguments passed via DynamicParameters method of fluent registration API.

其他来源: 请注意Typed Factory Facility转发传递给工厂方法的参数,将它作为内联参数。

处理器(Handler)

如果内联参数不能满足依赖关系,解析器会询问处理器是否可以满足它。处理程序尝试首先按名称解析依赖项,然后按类型。该值来自ComponentModelCustomDependencies集合,这通常意味着参数传递给DependsOn方法。

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

子解析器

如果以前的地方不能解析依赖,解析器将轮询它的每个子解析器(ISubDependencyResolver),如果他们可以提供依赖。

核心

当以上都不能解析的依赖容器将尝试自己做。根据依赖关系的类型,它将尝试执行以下操作:

  • 对于参数依赖,它将检查ComponentModelParameters集合来匹配依赖。这些包括从XML传递的参数或通过Parameters流利API方法。
  • 对于服务重写依赖,它将尝试解析与指定的键匹配的组件。
  • 对于服务依赖,它将尝试解析任何匹配指定服务的组件。

如果以上都不行,就会抛出DependencyResolverException

请参考

posted @ 2019-06-18 10:44  下一个起点  阅读(70)  评论(0)    收藏  举报