0

为什么默认工厂不会返回控制器的全名(带名称空间)? 我正在使用Service Locator和autofac。带区域的MVC 2 Beta DefaultControllerFactory

using System.Web.Mvc; 

using Microsoft.Practices.ServiceLocation; 

namespace Application.Core.MVC 
{ 

     public override IController CreateController(System.Web.Routing.RequestContext requestContext, string **controllerName**) 
     { 
      return ServiceLocator.Current.GetInstance<IController>(controllerName); 
     } 
} 

我有两个家控制器(一个下面积博客)

http://localhost/Home

http://localhost/Blog/Home

controllerName仅返回 “家” 没有完全限定名称无论是在上面的代码。 当我尝试为依赖注入注册控制器名称时,会产生问题。 根据这种情况,我现在如何注册控制器。即使这样也会毫无例外地出现这些页面。但是,当我访问http://localhost/Home时,两个控制器无论如何调用。

foreach (var tp in currentAssemblyControllersTypes) 
        builder.Register(tp).FactoryScoped().Named(tp.Name.Replace("Controller", "")); 

任何人都可以帮忙?谢谢。

回答

2

DefaultControllerFactory.CreateController()方法负责返回给定请求的控制器。 controllerName参数只是路由的{controller}部分。它的CreateController()的作业 - 不是它的调用者 - 根据URL中指定的控制器名称找出正确的类型。为了更容易,DefaultControllerFactory.CreateController()委托给其他两个方法:GetControllerType()和GetControllerInstance()。如果你想使用原始的控制器解析逻辑(例如类型查找),但只是改变类型的实例化方式,保留CreateController()和GetControllerType()方法,并重写GetControllerInstance()。这已经处理了你正在复制的命名空间查找逻辑,并且使你的代码变得更简单。

+0

谢谢。我应该只使用GetControllerInstance()。 – stoto 2009-11-26 15:58:30

0

[更新按照列维的答案]

1.注册每个控制器全称明确:

foreach (var tp in currentAssemblyControllersTypes) 
       builder.Register(tp).FactoryScoped().Named(tp.FullName) 

//Application.Controllers.HomeController 
//Application.Areas.Blog.Controllers.HomeController 

2 .Specify命名空间中图路线()用于Application.Controllers.HomeController在Global.ascx的.cs根据PDC09演示

routes.MapRoute(
        "Default",            // Route name 
        "{controller}/{action}/{id}",       // URL with parameters 
        new { controller = "Home", action = "Index", id = "" } // Parameter defaults 

        ,new string [] { "Application.Controllers"} //Specify namespace 

    ); 

     } 

3.Override GetControllerInstance()meothod IoCControllerFactory.cs

Protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, System.Type controllerType) 
{ 
    return (controllerType == null)? base.GetControllerInstance(requestContext,controllerType):ServiceLocator.Current.GetInstance<IController>(controllerType.FullName); 
}