2

Ich schreibe den Windows-Dienst Listner für Active MQ. Ich versuche Dependency Injection im Projekt zu implementieren. Aber ich bin mir nicht sicher, wo Container registriert werden und wie es gelöst wird?Verwenden von Windsor Castle IoC für Windows-Dienst

Ich habe versucht, es in OnStart Methode wie folgt zu setzen, aber kein Glück.

protected override void OnStart(string[] args) 
     { 
      container = new WindsorContainer(); 
      // IWindsorContainer container = new WindsorContainer(); 
      //container.Install(FromAssembly.This()); 
      container.Register(
       Component.For<IHttpClientProxyHandler>().ImplementedBy<HttpClientProxyHandlerWeb>().LifestyleTransient(), 
       Component.For<IHttpClientProxy>().ImplementedBy<HttpClientProxyWeb>().LifestyleTransient(), 
       //Component.For<IRedisCacheClient>().ImplementedBy<RedisCacheClient>().LifestyleTransient(), 
       Component.For<IApplicationSettings>().ImplementedBy<ApplicationSettings>().LifeStyle.PerWebRequest, 

       Component.For<ILogger>().ImplementedBy<Logger>().LifeStyle.PerWebRequest 

      ); 


      this.messagingQueue = new ActiveMessagingQueue(new ApplicationSettings(), new Logger()); 
      this.logger = new Logger(); 
      this.applicationSettings = new ApplicationSettings(); 
      this.httpClientProxyHandler = container.Resolve<IHttpClientProxyHandler>(); 

      this.messagingQueue.OnMessageReceived += this.OnListenerMessage; 
     } 

Dann habe ich versucht, in ServiceBase Constructor setzen - kein Glück. Sogar versucht, es in Hauptfunktion zu setzen. Aber immer unter Fehler immer im Ereignislogger.

‚Namespace.HttpClient.HttpClientProxyHandler‘ wartet auf die folgenden Abhängigkeiten: - Service ‚Castle.Windsor.IWindsorContainer‘, die nicht registriert wurde.

Kann mir hier jemand helfen?

+1

Versuchen Sie, IKernel anstelle von IWindsorContainer zu verwenden. Und im Allgemeinen möchten Sie den Container/Kernel nicht an Ihre Implementierungen weitergeben ... –

Antwort

2

Ich stimme mit Patrick überein, dass Sie nicht auf IWindsorContainer (oder) in Ihren registrierten Komponenten angewiesen sein sollten. Stellen Sie statt dessen sicher, dass die Komponenten (oder vielmehr die Schnittstellen, die diese Komponenten implementieren) benötigt werden, stellen Sie sicher, dass sie auch in Ihrem Container registriert sind, und lassen Sie Castle Windsor die gesamte Abhängigkeitshierarchie für Sie auflösen.

Warum sollten Sie keinen Mechanismus zum Auflösen von Abhängigkeiten für jede Komponente bereitstellen? Nun, es verbirgt die tatsächlichen Abhängigkeiten Ihrer Komponente und macht es schwieriger, sie in Tests lustig zu machen, da Sie den Dienst-Locator und die tatsächliche Abhängigkeit verspotten müssen. Es überträgt auch die Verantwortung für die Verwaltung von Abhängigkeiten auf Sie; In Castle Windsor, wenn Sie explizit Resolve eine Komponente ist es am besten zu Release es auch, wenn Sie fertig sind. Schließlich verbindet es Ihre Komponenten mit dem besonderen Geschmack von Dependency Injection, den Sie gerade verwenden, I.E. Schloss Windsor.

+0

Danke @Andy Lamb und Patrick. Könnten Sie bitte etwas mehr ausarbeiten? Wahrscheinlich mit einem Beispiel. – PaRsH

+0

@PaRsH Der Kernel/Container ist eine Art "Service Locator", und das Injizieren ist ein Anti-Pattern. Beginnen Sie mit [dieser Frage/Antwort] (https://stackoverflow.com/q/22795459/1698557), und machen Sie etwas zusätzliches Googeln, wenn Sie weitere Informationen benötigen. –

Verwandte Themen