我需要修改现有的Web应用程序以使用Castle.Windsor作为IOC容器。它最初是用StructureMap开发的。
我遇到了以下问题。
假设我已经注册了几个接口及其相应的实现:
IFoo -> Foo
IBar -> Bar
致电container.Resolve<IFoo>()
或container.Resolve<IBar>()
即可。这意味着服务已正确注册。
我有一个Web Api类,它依赖于其他服务,例如IFoo
public class BadRequestErrorHandler : HttpErrorHandler
{
// services
public BadRequestErrorHandler(IFoo foo) {...} // has dependency on IFoo
}
在StructureMap中我可以调用:
var test = ObjectFactory.GetInstance<BadRequestErrorHandler>();
这将解决IFoo依赖。
现在这对windsor不起作用。
如何用windsor实现这一目标?
谢谢!
*编辑 * 我只能通过明确地注册BadRequestErrorHandler来使其工作。
container.Register(Component.For<BadRequestErrorHandler>());
我只是希望有更好的方法来实现这一点,这不涉及注册具有依赖关系的类。我有一堆......
*编辑2 **
为了减轻痛苦,我添加了一种特殊方法来处理这些具体类型。
public T GetInstanceWithAutoRegister<T>()
{
if (container.Kernel.GetHandler(typeof(T)) == null)
{
container.Register(Component.For<T>());
}
return container.Resolve<T>();
}
public object GetInstanceWithAutoRegister(Type pluginType)
{
if (container.Kernel.GetHandler(pluginType) == null)
{
container.Register(Component.For(pluginType));
}
return container.Resolve(pluginType);
}
不理想,但至少比必须明确注册每种类型更好。希望有人有更好的解决方案
答案 0 :(得分:1)
您可以通过注册ILazyComponentLoader
来实现您想要的目标,这是一个钩子,当一个组件无法解析时,Windsor将其称为“最后的手段”。
在您的情况下,实现可能看起来像这样:
public class JustLetWindsorResolveAllConcreteTypes : ILazyComponentLoader
{
public IRegistration Load(string key, Type service)
{
return Component.For(service);
}
}
- 然后它应该这样注册:
container.Register(Component.For<ILazyComponentLoader>()
.ImplementedBy<JustLetWindsorResolveAllConcreteTypes>());
您可以详细了解in the docs。