1

Ich habe gerade angefangen, Windsor zu verwenden, um die Abhängigkeit zu lösen. Aber ich bekomme einen Fehler, während ich den String-Wert in meinem Controller übergebe. Ich überprüfte ein paar ähnliche Windsor-Posts, aber kein Glück.Die Komponente kann nicht erstellt werden, da Abhängigkeiten erfüllt werden müssen. Parameter, der nicht angegeben wurde

public class HomeController : Controller 
{ 
    public readonly String _A = string.Empty; 
    public HomeController(string A) 
    { 
     this._A = A;   
    } 
} 

Installer

public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container.Register(Classes.FromThisAssembly() 
      .BasedOn<IController>() 
      .LifestyleTransient()); 
    } 

WindsorControllerFactory

public class WindsorControllerFactory : DefaultControllerFactory 
    { 
     private readonly IKernel kernel; 

     public WindsorControllerFactory(IKernel kernel) 
     { 
      this.kernel = kernel; 
     } 

     public override void ReleaseController(IController controller) 
     { 
      kernel.ReleaseComponent(controller); 
     } 

     protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
     { 
      if (controllerType == null) 
      { 
       throw new HttpException(404, string.Format("The controller for path '{0}' could not be found.", requestContext.HttpContext.Request.Path)); 
      } 
      return (IController)kernel.Resolve(controllerType); 
     } 
    } 

Muss ich einpacken müssen 'A' in einer Klasse und lösen es entsprechende Schnittstelle ist?

Antwort

2

Ja, das wäre die bevorzugte Lösung, da es die Abhängigkeit sehr deutlich macht.

public class HomeControllerConfig 
{ 
    public string A { get; set; } 
} 

public class HomeController : Controller 
{ 
    public readonly String _A = string.Empty; 
    public HomeController(HomeControllerConfig config) 
    { 
     this._A = config.A;   
    } 
} 

Installer

public void Install(IWindsorContainer container, IConfigurationStore store) 
{ 
    ... 
    container.Register(Component.For<HomeControllerConfig>().Instance(new HomeControllerConfig { A = "..." })); 
} 
0

Es hängt davon ab, was A wirklich ist, semantisch für Ihre Anwendung, aber kurz gesagt, nein - Sie müssen es nicht wickeln. The documentation explains in detail wie Sie es konfigurieren.

Verwandte Themen