2011-04-15 44 views
1

我试图将一些使用Ninject的应用程序转换为Castle Windsor,这样我就可以消除一些依赖关系。Castle Windsor相当于ninject的WhenClassHas

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

即(在Ninject):

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

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

问题一 - 这可以在温莎完成吗?该文件有点混乱。

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

回答

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>(); 
}