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); 
}