C# castle windsor-根据对另一个组件的调用返回不同的实现

C# castle windsor-根据对另一个组件的调用返回不同的实现,c#,dependency-injection,castle-windsor,C#,Dependency Injection,Castle Windsor,我正在创建一个web API,我希望能够对其进行版本设置。我想这样做: 客户端应用程序传入自定义HTTP头,每个请求都包含版本 他们所反对的API 存在一个组件(称为IVersionRetriever或其他东西)来拉动 请求中的版本号。温莎城堡负责 用于提供IVersionRetriever的实例 我希望服务接口的实现有所不同 在版本之间,Castle Windsor配置为检查 IVersionRetriever.ApiVersion并返回一个实现 根据得到的数值 所有这些看起来都很简单,但我无

我正在创建一个web API,我希望能够对其进行版本设置。我想这样做:

  • 客户端应用程序传入自定义HTTP头,每个请求都包含版本 他们所反对的API
  • 存在一个组件(称为
    IVersionRetriever
    或其他东西)来拉动 请求中的版本号。温莎城堡负责 用于提供
    IVersionRetriever
    的实例
  • 我希望服务接口的实现有所不同 在版本之间,Castle Windsor配置为检查
    IVersionRetriever.ApiVersion
    并返回一个实现 根据得到的数值
  • 所有这些看起来都很简单,但我无法从温莎的注册API中计算出我如何对温莎说“对,对于
    IFoo
    ,如果
    IVersionRetriever.ApiVersion
    是1,那么我想要一个
    SuperFoo
    ,但是如果版本是2,那么我想要一个
    SuperDuperFoo

    我将如何配置它


    如果相关的话,所有组件都有一个PerWebRequest的生活方式。

    根据ApiVersion使用TypedFactory来解析所需的IFoo怎么样?在这种情况下,依赖关系将不在IFoo上,而是在IFooFactory上

    使用TypedFactory根据ApiVersion解析所需的IFoo怎么样?在这种情况下,依赖关系将不在IFoo上,而是在IFooFactory上,只是为了让您知道将来如何做:

    container.Register(Component.For<IUnitOfWork>().UsingFactoryMethod(() => IVersionRetriever.ApiVersion == 1 ? new SuperFoo() : new SuperDuperFoo() ).LifeStyle.PerWebRequest);
    
    container.Register(Component.For().UsingFactoryMethod(()=>IVersionRetriever.ApiVersion==1?new SuperFoo():new SuperDuperFoo()).lifety.PerWebRequest);
    

    但我同意@Cristiano answer.

    只是为了让你知道今后如何做:

    container.Register(Component.For<IUnitOfWork>().UsingFactoryMethod(() => IVersionRetriever.ApiVersion == 1 ? new SuperFoo() : new SuperDuperFoo() ).LifeStyle.PerWebRequest);
    
    container.Register(Component.For().UsingFactoryMethod(()=>IVersionRetriever.ApiVersion==1?new SuperFoo():new SuperDuperFoo()).lifety.PerWebRequest);
    

    但是我同意@Cristiano answer。

    在调用之前,我不需要从容器中获取
    IVersionRetriever
    实例吗?将其更改为()=>container.Resolve().ApiVersion==1在调用之前,我不需要从容器中获取
    IVersionRetriever
    实例吗?将其更改为()=>container.Resolve().ApiVersion==1