Castle Windsor相当于来自ninject的WhenClassHas

时间:2011-04-15 15:17:29

标签: castle-windsor ninject

我正在尝试将使用Ninject的一些应用程序转换为Castle Windsor,以便我可以消除一些依赖项。

我无法弄清楚如何使用windsor中的container.Register方法来实现Ninject的一些功能。

即(在Ninject中):

Kernel.Bind<ISessionProvider>().To<UnitOfWorkSessionProvider>();
Kernel.Bind<ISessionProvider>().To<ThreadSafeSessionProvider>()
  .WhenClassHas<RequireThreadSafeSession>();

这告诉Ninject在构造函数中构建一个具有ISessionProvider的类时,使用UnitOfWorkSessionProvider,除非它具有RequireThreadSafeSession属性,在这种情况下它被赋予一个ThreadSafeSessionProvider。

问题一 - 这可以在温莎完成吗?文档有点令人困惑。

问题二 - 如何做到这一点?似乎在AllTypes配置类中允许条件绑定,但使用模式不是那么透明

1 个答案:

答案 0 :(得分:2)

您可以在注册API中使用UsingFactoryMethod来使用后期绑定并决定实现。试试这个:


container.Register(Component.For<ThreadSafeSessionProvider>());
container.Register(Component.For<UnitOfWorkSessionProvider>());
container.Register(Component.For<ISessionProvider>().UsingFactoryMethod((x, u) => FindImpl(x, u)));
container.Register(Component.For<ClassUnderTest>());

private ISessionProvider FindImpl(IKernel kernel, CreationContext context)
{
   var classUnderTest = context.Handler.ComponentModel.Implementation;
   if (classUnderTest.HasAttribute<IsThreadSafeAttribute>())
   {
      return kernel.Resolve<ThreadSafeSessionProvider>();
   }

   return kernel.Resolve<UnitOfWorkSessionProvider>();
}