2014-01-14 9 views
11

Ich bin ein Schloss Winsor Noob. Ich habe ein WebForm-Projekt, das ein heißes Durcheinander ist. Ich versuche eine Abhängigkeit zu lösen, um die Benutzerregistrierung zu testen. Wie komme ich zum aktuellen WindsorContainer?Wie bekomme ich den aktuellen Castle Windsor Container?

IWindsorContainer container = ???; 
IRegistrationLogic registrationLogic = container.Resolve<IRegistrationLogic>(); 
_registrationLogic.Register(); 

Hier ist mein Bootstrapper:

public class WindsorConfigTask : ICastleBootstrapperTask 
{ 

    public void Execute() 
    { 
     Container.AddFacility<WcfFacility>(); 
     Container.Register(
      Component.For<IProcessMessageRequest>() 
       .ActAs(
        new DefaultClientModel 
        { 
         Endpoint = 
          WcfEndpoint.ForContract<IProcessMessageRequest>().FromConfiguration("surveyClient2") 
        } 
       ), 
      Component.For<ILocalMembershipService>() 
       .ActAs(
        new DefaultClientModel 
        { 
         Endpoint = 
          WcfEndpoint.ForContract<ILocalMembershipService>().FromConfiguration(
           "localMembershipClient") 
        }) 


      ); 

     Container.Register(Component.For<IRegistrationLogic>() 
      .ImplementedBy<RegistrationLogic>() 
      .LifeStyle.Is(LifeStyleType)); 
    } 

    public IWindsorContainer Container { get; set; } 


    #region ICastleBootstrapperTask Members 


    public Castle.Core.LifestyleType LifeStyleType 
    { 
     get; 
     set; 
    } 

    #endregion 
} 

Antwort

6

Es gibt viele Möglichkeiten, dieses Problem zu lösen, aber ich denke, die am häufigsten eine Singleton Hilfsklasse zu erstellen, ist die Referenz zu halten. Denken Sie daran, Sie möchten App verwenden, DI zu verwenden, um alles automatisch aus dem Container zu erhalten. Vielleicht sind nur ein paar Anrufe von der App zum Container. Schauen Sie sich die Steuerungsfabriken für Windsor an.

So etwas ...

public static class ContainerManager 
{ 
    public static IWindsorContainer Container = null; 
} 

Jetzt wurde ich gewusst, dass es einen Schritt weiter zu nehmen und man konnte einige Dienstprogramme mit einem bekommen sind ...

public static class ContainerManager 
    { 
     private static IWindsorContainer _container = null; 
     public static IWindsorContainer Container 
     { 
      get { 
       if (_container == null) { 
         // run installers, set _container = new container 
       } 
       return _container; 
      } 

     } 
    } 

ich auch erkennen, Sie fragen sich vielleicht, wie ich den Container von einem Downstream abhängigen Objekt bekomme ... Sie können den Container selbst registrieren. Standardmäßig wird IKernel registriert, aber Sie können IWindsorContainer später zur Injektion registrieren. Ich würde sehr davon abraten, den Behälter direkt zu benutzen. Wie in oben stehendem Code ... machst du ein Release wenn du fertig bist ???

16

In Windsor gibt es eine Schnittstelle für diesen Zweck. Es heißt IContainerAccessor. Die beste Ort, es zu implementieren ist die Global.asax Datei:

public class WebApplication : HttpApplication, IContainerAccessor { 
    static IWindsorContainer container; 

    public IWindsorContainer Container { 
    get { return container; } 
    } 

    protected void Application_Start() { 
    var bootstrapper = new WindsorConfigTask(); 
    bootstrapper.Execute(); 
    container = bootstrapper.Container; 
    } 

    protected void Application_End() { 
    container.Dispose(); 
    } 
} 

Die Verwendung in Ihrem Web-Formular, wie folgend:

var containerAccessor = Context.ApplicationInstance as IContainerAccessor; 
var container = containerAccessor.Container; 
+0

, dass die gleiche Sache tut, schlug ich vor, aber es ist nicht offensichtlich, dass Sie erstellen müssen eine Statik des Containers. Die statische ist wirklich der Schlüssel, nicht die Eigenschaft, die die Schnittstelle vorschlägt. – CrazyDart

+0

ich nicht, denn hier ist gut definiert, wann der Container erstellt wird und wann er aufgeräumt wird. Ihre Lösung kann einige Probleme mit sich bringen. –

+0

Das ist großartig .. wie kann ich auf diesen Kontext in WebAPI zugreifen? – ppumkin

Verwandte Themen