我正在使用第三方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);
}
}
答案 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);
}