我正在尝试将使用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配置类中允许条件绑定,但使用模式不是那么透明
答案 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>();
}