0

为什么默认工厂不会返回控制器的全名(带有命名空间)?我正在使用服务定位器和 autofac。

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/首页

http://localhost/博客/首页

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

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

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

4

2 回答 2

2

DefaultControllerFactory.CreateController() 方法负责为给定请求返回一个控制器。controllerName 参数只是路由的 {controller} 部分。CreateController() 的工作——而不是调用者的工作——在给定 URL 中指定的控制器名称的情况下找出正确的类型。

为了使这更容易,DefaultControllerFactory.CreateController() 委托给另外两个方法:GetControllerType() 和 GetControllerInstance()。如果您想使用原始控制器解析逻辑(例如类型查找)但只是更改类型的实例化方式,请将 CreateController() 和 GetControllerType() 方法保持原样,并覆盖 GetControllerInstance()。这已经处理了您正在复制的名称空间查找逻辑,并使您的代码更加简单。

于 2009-11-26T04:42:08.990 回答
0

[根据李维斯的回答更新]

1.显式注册每个控制器的全名:

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

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

2 . 根据 PDC09 demo 在 Global.ascx.cs 中为 Application.Controllers.HomeController 在 MapRoute() 中指定命名空间

    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.重写GetControllerInstance()方法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);
 }
于 2009-11-25T21:04:52.790 回答