2014-09-15 2 views
4

J'ai récemment découvert TopShelf. De tout ce que j'ai lu, ça a l'air très cool. Le seul problème est que je n'ai pas été capable de l'utiliser. Je dois avoir raté quelque chose. Voici mon code.Comment démarrer avec TopShelf

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using Topshelf; 

namespace TestTopShelf { 
public class FooBar { 
    public FooBar() { 

    } 

    public void Start() { } 
    public void Stop() { } 
} 

public class Program { 
    public static void Main() { 
     HostFactory.Run(x => { 

      x.Service<FooBar>(s => { 

      }); 
     }); 
    } 
} 
} 

Vous pouvez voir que c'est un peu incomplet. Lorsque j'essaie de définir les propriétés de l'objet 's' pour ConstructUsing, WhenStarted et WhenStopped Visual Studio ne déduit pas le type correct. Je suis nouveau pour les expressions lambda et même plus récent pour TopShelf, donc je ne suis pas sûr de ce que je fais. J'utilise this page dans la documentation TopShelf pour commencer. Cela semble assez simple, alors je ne suis pas sûr de ce que j'ai manqué.


code mis à jour


using Autofac; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using Topshelf; 

namespace KeithLink.Svc.Windows.OrderService2 { 
class FooBar { 
    public FooBar() { } 

    public void Start() { } 
    public void Stop() { } 
} 

class Program { 
    static void Main(string[] args) { 
     HostFactory.Run(x => { 

      x.Service<FooBar>(s => { 
       s.ConstructUsing(name => new OrderService()); 
       s.WhenStarted(os => os.Start()); 
       s.WhenStopped(os => os.Stop()); 
      }); 

      x.RunAsLocalSystem(); 

      x.SetDescription("some service description"); 
      x.SetServiceName("ServiceName"); 
      x.SetDisplayName("Service Display Name"); 
     }); 
    } 
} 
} 
+1

Cela ne fonctionne-t-il pas comme vous le souhaitez? Si oui, comment pensez-vous que cela devrait fonctionner et comment cela fonctionne-t-il réellement? Y at-il des erreurs? Si c'est vrai, que sont-ils? –

+1

Bien que IntelliSense de VisualStudio ne déduit pas le type correct, il devrait toujours compiler. Je ne sais pas ce que fait topshelf mais je me souviens d'avoir eu ces problèmes la dernière fois que j'ai essayé de l'utiliser. – tobsen

+0

@PeterRitchie quand je déclare s, il me donne un message qui dit "Delegate 'System.Func ' ne prend pas 1 arguments" parmi 7 autres erreurs. – fizch

Répondre

4

Bien que IntelliSense de VisualStudio ne déduit pas le type correct, il devrait toujours compiler. Je ne sais pas ce que fait topshelf mais je me souviens d'avoir eu ces problèmes la dernière fois que j'ai essayé de l'utiliser.

3

Lorsque vous voulez « enregistrer » un service à exécuter au démarrage avec Topshelf vous appelez la méthode Service<T>.Run - que vous semblez avoir obtenu commencé. Dans cette méthode, vous êtes passé un objet HostConfigurator que vous pouvez dire (configurer) TopShelf à propos de votre service. Il y a plusieurs choses que vous pouvez configurer à propos de votre service, mais vous voulez généralement lui dire comment instancier votre service et comment l'arrêter et le démarrer. vous faites cela en passant le "code" qui fait ces choses. Vous pouvez utiliser un lambda pour le faire, par exemple:

public static void Main() { 
    HostFactory.Run(x => { 

     x.Service<FooBar>(s => { 
      s.ConstructUsing(name => new FooBar()); 
      s.WhenStarted(fb => fb.Start()); 
      s.WhenStopped(fb => fb.Stop()); 
     }); 
     x.RunAsLocalSystem(); // use the local system account to run as 

     x.SetDescription("My Foobar Service"); // description seen in services control panel 
     x.SetDisplayName("FooBar"); // friendly name seen in control panell 
     x.SetServiceName("foobar"); // used with things like net stop and net start 
    }); 
} 

Ce code ne doit pas être lambdas, vous pouvez créer des méthodes pour le faire (à titre d'exemple, cela pourrait être plus clair):

Cela obtient votre plus ou moins commencé quand une classe FooBar, s'il y a quelque chose de plus spécifique, s'il vous plaît mettez à jour votre question.

Avec ces méthodes nommées, lorsque Topshelf commence à courir (après l'appel à HostFactory.Run) votre méthode CreateSearch serait appelée, votre méthode CallStart serait appelé, et quand le service est arrêté, votre CallStop sera appelée.