Cast Castle IControllerProxy到ControllerBase

时间:2014-07-24 14:04:24

标签: c# asp.net-mvc castle-windsor

我使用this post在我的MVC4项目中创建授权。问题是我使用Castle Windsor作为DI。当调用下面的函数时,我在行return (ControllerBase) controller

上收到错误
static ControllerBase GetControllerByName(
    HtmlHelper helper, string controllerName)
{
    IControllerFactory factory = 
        ControllerBuilder.Current.GetControllerFactory();

    IController controller = factory.CreateController(
        helper.ViewContext.RequestContext, controllerName);

    if (controller == null)
    {
        throw new InvalidOperationException(
            string.Format(
                CultureInfo.CurrentUICulture,
                "Controller factory {0} controller {1} returned null",
                factory.GetType(),
                controllerName));
    }

    return (ControllerBase) controller; // <= error here
}

我得到的错误是:

Unable to cast object of type 
'Castle.Proxies.IControllerProxy_2' to type 'System.Web.Mvc.ControllerBase'.

有没有办法让我能够做到这一点?

1 个答案:

答案 0 :(得分:1)

你得到一个Castle.Proxies.IControllerProxy_2的事实是你已经为你的组件添加了一个拦截器。注册组件时,请将组件本身注册为服务,而不是仅注册接口。这将为windsor创建一个类代理。 即代替:

Component.For<IService>().ImplementedBy<Component>

使用

Component.For<IService, Component>().ImplementedBy<Component>

如果您使用类型进行注册,请添加WithServiceSelf。

亲切的问候, Marwijn。