2010-12-01 81 views
1

我正在向我的MS MVC應用程序中引入DI,並且無法從我的自定義控制器工廠中實例化控制器。看來重寫的「GetControllerInstance」沒有被調用。MVC - 創建城堡溫莎控制器工廠 - 沒有爲此對象定義的無參數構造函數

有人能告訴我我失蹤了什麼嗎?

我的控制器廠:

public class WindsorControllerFactory : DefaultControllerFactory 
{ 
    public WindsorControllerFactory() 
    { 
     var controllerTypes = from t in AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes()) 
           where typeof (IController).IsAssignableFrom(t) 
           select t; 
     foreach (Type controllerType in controllerTypes) 
     { 
      ApplicationContainer.Container.AddComponentLifeStyle(controllerType.FullName, controllerType, 
                   LifestyleType.Transient); 
     } 
    } 

    protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType) 
    { 
     if(controllerType !=null) 
     { 
      return (IController) ApplicationContainer.Container.Resolve(controllerType); 
     } 
     return base.GetControllerInstance(requestContext, controllerType); 
    } 
} 

}

的Application_Start:

ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory()); 
    } 

控制器工廠被實例化,但它似乎它不是用來解決控制器。我在'GetControllerInstance'上放置了一個斷點,但它從未被擊中。

結果是沒有爲此對象定義的無參數構造函數。拋出異常

更新:

我改變了GetControllerInstance這樣:

private WindsorContainer _container; 

    public WindsorControllerFactory(WindsorContainer container) 
    { 
     _container = container; 
     _container.Register(AllTypes.Of<IController>().FromAssembly(
     typeof(BaseFactoryController).Assembly).Configure(
      c => c.Named(c.Implementation.Name.ToLowerInvariant()).LifeStyle.Transient)); 
    } 

現在,我不得不忽視空controllerType?!如果這沒有評論:

//base.GetControllerInstance (requestContext,controllerType);

它開始把我的.js文件當作控制器。會拋出httpException

protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType) 
    { 
     if (controllerType == null) 
     { 
      return null; 
     } 
     //base.GetControllerInstance(requestContext, controllerType); 
     return (IController) _container.Resolve(controllerType); 
    } 
+0

關於把js當成控制器,同樣的問題,相同的建議http://stackoverflow.com/questions/1598421/why-is-castle-windsor-trying-to-resolve-my-content-and-scripts-folder -as-a-co – 2010-12-03 00:31:34

回答

1

creating WindsorContainer results in type conversion error(不完全一樣的問題,但它仍然同樣的答案)

+0

如果可能的話,我寧願不引入另一個庫。我更想知道爲什麼這個實現不起作用。 – Nick 2010-12-02 16:43:28

+0

@Nick:你可以使用MVCContrib的實現作爲參考,與你的比較。 – 2010-12-02 19:08:12

0

你可能有另一個問題是,這一呼籲:

AppDomain.CurrentDomain.GetAssemblies() 

.. 。如果程序集尚未真正加載到AppDomain中,則不會檢索所有可用的控制器。 AppDomain在需要時加載程序集,因此如果您沒有在代碼中顯式調用它們,則不會加載它們。

相關問題