Castle ControllerFactory不适用于MVC区域的示例

时间:2011-02-15 14:17:11

标签: asp.net-mvc-3 castle-windsor

在看似针对MVC 3.0和Castle.Windsor的示例后,我遇到了一些障碍 - 我知道一种解决方法,但我真的很困惑“最佳做法”是做什么的现在

http://stw.castleproject.org/(S(su2mgm45fclhqe55veo40545))/Windsor.MainPage.ashx

在此示例中,作者构造了WindsorControllerFactory。 [http://stw.castleproject.org/(S(su2mgm45fclhqe55veo40545))/Windsor.Windsor-tutorial-part-two-plugging-Windsor-in.ashx]

以下是他使用的代码......

public class WindsorControllerFactory: DefaultControllerFactory
{
    private readonly IKernel kernel;

    public WindsorControllerFactory(IKernel kernel)
    {
        this.kernel = kernel;
    }

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

    public override IController CreateController(RequestContext requestContext, string controllerName)
    {
        var controllerComponentName = controllerName + "Controller";
        return kernel.Resolve<IController>(controllerComponentName);
    }
}

现在,这确实有用......有点儿。任何涉及区域ASP.NET MVC应用程序都会出现此问题。 controllerName在那里不起作用。

在我看到的其他ControllerFactory实现中,人们以这样的方式使用覆盖的方法GetControllerInstance ......

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

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

所以我很困惑。什么被认为是最好的方法? CreateControllerGetControllerInstance

在任何人提出MVCContrib之前 - 我已经探索过了,而且非常坦诚,我必须要么是荒谬可笑,要么就是错过了重点,因为我甚至找不到它的ControllerFactory - 而且我已经为它下载了二进制文件,我无法连接任何东西。我知道这个项目是一个非常好的项目,而不是抨击它 - 但我看到它引用了很多,我找不到人们在谈论什么。

任何人都可以帮助我澄清这个谜团吗?为什么本教程的作者向我们展示了一个不能与Areas一起使用的ControllerFactory?如何与他们合作?为什么有些人使用CreateController而有些人使用GetControllerInstance?任何信息都过分赞赏。

1 个答案:

答案 0 :(得分:1)

其实你是对的。在引入区域之前1天,MVC中的现有实施是可行的。目前应覆盖GetControllerInstance方法以适应这种情况。随意修复它并提交拉取请求。