我怎样才能在温莎城堡实现这一目标? (从StructureMap迁移)

时间:2011-10-23 17:55:06

标签: inversion-of-control castle-windsor ioc-container

我需要修改现有的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);
}

不理想,但至少比必须明确注册每种类型更好。希望有人有更好的解决方案

1 个答案:

答案 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