Castle Windsor如何响应实现多个接口的类?

Ger*_*nck 5 castle-windsor ioc-container inversion-of-control

例如,我有两个接口:ICustomerService和IOrderService,每个接口都有一些函数,如GetCustomer,GetOrder等.

我想要一个类来实现两个接口:服务器.

Castle Windsor如何应对此问题?有可能首先吗?当我基于两个接口之一解析Server对象时,我会获得相同的对象吗?当我的构造函数在其参数中包含两个接口时会发生什么?是否仍然会构建一个对象.

假设LifeStyle保持默认值:Singleton.

Krz*_*mic 4

CLR 类型和 Windsor 服务或组件之间不存在硬性的一对一映射(如果需要,可以在此处查看术语表)。

因此,您可能会出现以下任何一种情况:

  • 许多具有不同实现类型的组件公开一个服务

    container.Register(
       Component.For<IFoo>().ImplementedBy<Foo1>(),
       Component.For<IFoo>().ImplementedBy<Foo2>()
    );
    
    Run Code Online (Sandbox Code Playgroud)
  • 许多具有相同实现类型的组件公开一个服务

    container.Register(
       Component.For<IFoo>().ImplementedBy<Foo1>(),
       Component.For<IFoo>().ImplementedBy<Foo1>().Named("second")
    );
    
    Run Code Online (Sandbox Code Playgroud)
  • 许多具有相同实现类型的组件公开不同的服务

    container.Register(
       Component.For<IFoo>().ImplementedBy<Foo1>(),
       Component.For<IBar>().ImplementedBy<Foo1>().Named("second")
    );
    
    Run Code Online (Sandbox Code Playgroud)
  • 单个组件公开不同的服务

    container.Register(
       Component.For<IFoo, Bar>().ImplementedBy<Foo1>()
    );
    
    Run Code Online (Sandbox Code Playgroud)

正如您所看到的,是的 - 这是可能的,并且您是否会获得相同的实例(假设单例)取决于您选择的选项 - 两个服务是否将由同一个组件公开。