在看似针对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);
}
所以我很困惑。什么被认为是最好的方法? CreateController
或GetControllerInstance
?
在任何人提出MVCContrib之前 - 我已经探索过了,而且非常坦诚,我必须要么是荒谬可笑,要么就是错过了重点,因为我甚至找不到它的ControllerFactory - 而且我已经为它下载了二进制文件,我无法连接任何东西。我知道这个项目是一个非常好的项目,而不是抨击它 - 但我看到它引用了很多,我找不到人们在谈论什么。
任何人都可以帮助我澄清这个谜团吗?为什么本教程的作者向我们展示了一个不能与Areas一起使用的ControllerFactory?如何与他们合作?为什么有些人使用CreateController
而有些人使用GetControllerInstance
?任何信息都过分赞赏。
答案 0 :(得分:1)
其实你是对的。在引入区域之前1天,MVC中的现有实施是可行的。目前应覆盖GetControllerInstance
方法以适应这种情况。随意修复它并提交拉取请求。