如何让Castle Windsor忽略某些路线/控制器?

时间:2015-06-24 19:18:27

标签: castle-windsor controllers

我正在使用第三方API和Castle Windsor的默认控制器工厂。不幸的是,这个第三方API有一些他们正在使用的控制器,这些控制器正由Castle Windsor以外的其他东西实例化。所以基本上在我的方法中我需要说,忽略这些控制器/路由,我该怎么做?

这是我的工厂:

public class WindsorControllerFactory : DefaultControllerFactory
{
    private readonly IKernel _kernel;

    public WindsorControllerFactory(IKernel kernel)
    {
        _kernel = kernel;
    }

    public override void ReleaseController(IController controller)
    {
        _kernel.ReleaseComponent(controller);
    }

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        if (controllerType == null)
            throw new HttpException(404, string.Format("The controller for path '{0}' could not be found.", requestContext.HttpContext.Request.Path));

        return (IController)_kernel.Resolve(controllerType);
    }
}

1 个答案:

答案 0 :(得分:2)

我猜您按惯例注册组件。在这种情况下,只需更改注册,以便使用Unless子句不注册与第三方API匹配的控制器

container.Register(
    Classes
    .FromAssemblyInThisApplication()
    .InSameNamespaceAs<Controller>()
    .Unless(type => type.Name == "NotThisController" || type.Namespace.Contains("NotHere"))
    .WithServiceAllInterfaces());

这是精心组织您的命名空间,类和结构可以获得回报的地方:)

编辑补充:stuartd的评论让我意识到我没有明确解释下一步。在您的工厂中,然后检查是否存在类型注册并路由到正确的解决方案机制:

protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
    if (controllerType == null)
        throw new HttpException(404, string.Format("The controller for path '{0}' could not be found.", requestContext.HttpContext.Request.Path));

    if (!_kernel.HasComponent(controllerType))
    {
         // return the component with your custom third party resolution
    }

    return (IController)_kernel.Resolve(controllerType);
}