2016-08-29 1 views
0

Ich habe einen Windows-Dienst, den Oberboden und im Hauptverfahren des Dienstes verwendet ich habe,Spring.Net injizieren in instanziierten Windows-Dienst? Ist es möglich?

static void Main(string[] args) 
     { 
      //TopShelf 
      if (args != null && args.Length > 0) 
      { 
       var host = HostFactory.New(
         x => 
         { 
          x.Service<MyWindowsSvcHost>(
           s => 
           { 
            s.ConstructUsing(name => new MyWindowsSvcHost()); 
            s.WhenStarted(tc => tc.Start(null)); 
            s.WhenStopped(tc => tc.Stop()); 
           }); 
          x.RunAsLocalSystem(); 
          x.SetDescription("SomeServiceName"); 
          x.SetDisplayName("SomeServiceName"); 
          x.SetServiceName("SomeServiceName"); 

         }); 
       host.Run(); 

       Environment.ExitCode = 0; 
      } 
      else 
      { 
       ServiceBase[] ServicesToRun = new ServiceBase[] { new MyWindowsSvcHost() }; 
       ServiceBase.Run(ServicesToRun); 
      } 
     } 

I Feder verwenden in statische Eigenschaft dieses Dienstes zu injizieren. In MyWindowsSvcHost habe ich eine statische Eigenschaft myStaticProperty, in die ich laden möchte. Hier finden Sie, wie mein Service app.config sieht aus wie

<object id="SomeName" singleton="false" type="MyWindowsSvcHostAssembly.MyWindowsSvcHost, MyWindowsSvcHostAssembly"> 
     <property name="MyStaticProperty" ref="myStaticObject" /> 
     </object> 

     <object id="myStaticObject" singleton="true" type="SomeAssembly.MyStaticClass, SomeAssembly"> 
     </object> 

Und im Inneren des Service, ich habe die Eigenschaft

public static Someclass MyStaticProperty {get; einstellen; }

Aber das ist immer null. Wenn ich den Singleton unten auf true ändere und es debugge, wird es immer korrekt zugewiesen und alles funktioniert.

<object id="SomeName" singleton="true" type="MyWindowsSvcHostAssembly.MyWindowsSvcHost, MyWindowsSvcHostAssembly"> 
      <property name="MyStaticProperty" ref="myStaticObject" /> 
      </object> 

Irgendeine Idee, was hinter den Kulissen hier geschieht?

Antwort

1

Die Lösung dafür erwies sich als einfach. Wenn ich den Dienst starte,

ServiceBase[] ServicesToRun = new ServiceBase[] { new MyWindowsSvcHost() }; 

Anstatt eine neue Instanz zu erstellen, musste ich es auf Feder geladen Instanz auflösen.

Verwandte Themen