2010-12-01 6 views
1

Ich führe DI in meine MS MVC-Anwendung ein und habe Probleme, die Controller aus meiner benutzerdefinierten Controller Factory instanziiert zu bekommen. Es scheint, dass das überschriebene "GetControllerInstance" nicht aufgerufen wird.MVC - Erstellen eines Castle Windsor Controller Factory - Kein parameterloser Konstruktor für dieses Objekt definiert

Kann mir jemand sagen, was ich vermisse?

My-Controller Factory:

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

Der Controller Factory instanziiert und aber es scheint, dass es nicht verwendet wird, um den Controller zu lösen. Ich habe einen Haltepunkt auf "GetControllerInstance" platziert, aber es wird nie getroffen.

Das Ergebnis ist Kein parameterloser Konstruktor für dieses Objekt definiert. Ausnahme ausgelöst

Update:

ich die GetControllerInstance dazu geändert:

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

Jetzt habe ich null controller ignorieren? Wenn dies nicht kommentiert ist:

//base.GetControllerInstance (requestContext, controllerType);

Es fängt an, meine .js-Dateien als Controller zu behandeln. Welche wirft 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

über die Behandlung von js als Controller, die gleiche Frage, die gleiche Empfehlung wie http://stackoverflow.com/questions/1598421/why-is-castle-windsortry-to-resolve-my-content-and-scripts-folder -as-a-co –

Antwort

1

creating WindsorContainer results in type conversion error See (nicht ganz die gleiche Frage, aber es ist die gleiche Antwort dennoch)

+0

Ich würde lieber nicht eine andere Bibliothek vorstellen, wenn überhaupt möglich. Ich möchte lieber wissen, warum diese Implementierung nicht funktioniert. – Nick

+0

@Nick: Sie können die MVCContrib-Implementierung als Referenz verwenden, um sie mit Ihrer zu vergleichen. –

+0

@Maurcio: Sie gewinnen :) Ich schaue MVCContib. Wo ist der MVCContrib.Castle-Namespace? Es scheint nicht in der MVCContrib.dll zu sein – Nick

0

Das andere Problem, dass diese Aufforderung haben:

AppDomain.CurrentDomain.GetAssemblies() 

.. .Wenn alle Assemblys nicht in die AppDomain geladen wurden, werden nicht alle verfügbaren Controller abgerufen. Die AppDomain lädt Assemblys, wenn sie benötigt werden. Wenn Sie sie nicht explizit im Code aufgerufen haben, werden sie nicht geladen.

+0

Ich aktualisiere meinen Beitrag mit neuer Implementierung von diesem. – Nick

Verwandte Themen