6

Ich bekomme den 'Kein parametrischer Konstruktor für dieses Objekt definiert' auf meinem Controller, wenn der Controller und seine Abhängigkeiten entsprechend über (DI/IoC) Muster mit Castle registriert werden Windsor. Kann jemand das folgende betrachten und meinen Fehler sehen, weil ich es nicht sehen kann. IoC Castle Windsor - Kein parameterloser Konstruktor für dieses Objekt definiert

enter image description here

-Code für die Registrierung auf global.asax

public class MyApplication : System.Web.HttpApplication 
{ 
    public MvcApplication() 
    { 
     this.container = new WindsorContainer().Install(new DependencyInstaller()); 
    } 
    protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     WebApiConfig.Register(GlobalConfiguration.Configuration); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 
     GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator), 
     new WindsorActivator(this.container)); 
    } 
} 

Mein DI

public class DependencyInstaller : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container.Register(
      Component.For<IDatabaseFactory>().ImplementedBy<DatabaseFactory>().LifeStyle.PerWebRequest, 
      Component.For<IUnitOfWork>().ImplementedBy<UnitOfWork>().LifeStyle.PerWebRequest, 
      Component.For<IMappingEngine>().ImplementedBy<MappingEngine>().UsingFactoryMethod(() => Mapper.Engine).LifeStyle.Singleton, 
      Component.For<IFirmTasks>().ImplementedBy<FirmTasks>().LifeStyle.PerWebRequest, 
      Classes.FromAssemblyContaining<PersonController>().BasedOn<IController>().LifestyleTransient(), 
      Classes.FromThisAssembly().BasedOn<IHttpController>().LifestyleTransient(), 
      Classes.FromAssemblyNamed("Core.Firm.Tasks").Where(type => type.Name.EndsWith("Tasks")).WithServiceAllInterfaces().LifestylePerWebRequest(), 
      Classes.FromAssemblyNamed("Core.Firm.Repository") 
       .Where(type => type.Name.EndsWith("Repository")).WithServiceAllInterfaces().LifestylePerWebRequest() 
      ); 
    } 
} 

mein Controller

public class PersonController : Controller 
{ 
    private IFirmTasks tasks; 

    public PersonController(IFirmTasks tasks) 
    { 
     this.tasks = tasks; 
    } 

Wenn lade ich die Anwendung der Der Container lädt alle Abhängigkeiten, die nach dem Screenshot beim Debuggen aufgelöst wurden.

enter image description here

Hat jemand da draußen eine Idee ist, wo liegen meine Fehler. Danke im Voraus.

Antwort

8

Wenn ich die Anwendung lädt, lädt der Container alle Abhängigkeiten, die nach dem Screenshot beim Debuggen aufgelöst wurden.

Ja, alle Ihre Typen sind registriert. Wenn Sie var controller = container.Resolve<PersonController>(); in Global.asax schreiben, sollten Sie eine Instanz Ihres Controllers erhalten.

Ihre Implementierung ist gültig für Asp.Net WebApi und funktioniert nur für System.Web.Http.ApiController s.

Ihr Code funktioniert nicht richtig, weil Ihre PersonController erbt System.Web.Mvc.Controller und System.Web.Mvc.DefaultControllerFactory wird verwendet. Sie können es auf dem ersten Bild sehen.

Sie sollten Ihre benutzerdefinierte ControllerFactory in Global.asax schreiben und injizieren, um Asp.Net MVC-Controller zu erstellen.

//Set the controller builder to use our custom controller factory 
    var controllerFactory = new WindsorControllerFactory(container); 
    ControllerBuilder.Current.SetControllerFactory(controllerFactory); 

Sie können more in this answer on another SO question lesen.

Hier ist eine Standardimplementierung von WindsorControllerFactory:

/// <summary> 
/// Controller factory the class is to be used to eliminate hard-coded dependencies 
/// between controllers and other components 
/// </summary> 
public class ControllerFactory : DefaultControllerFactory 
{ 
    private readonly IWindsorContainer container; 

    public WindsorControllerFactory(IWindsorContainer container) 
    { 
     this.container = container; 
    } 

    public override void ReleaseController(IController controller) 
    { 
     container.Release(controller.GetType()); 
    } 

    protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType) 
    { 
     return (IController)container.Resolve(controllerType); 
    } 
} 
+0

Das erklärt viel. Danke Ilja. –