views:

287

answers:

1

We are trying to implement a single Windows Services that starts multiple services under the same process. According to code I've seen you do the following:

    static void Main()
    {
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[] 
  { 
            new Service1(),
            new Service2()
  };
        ServiceBase.Run(ServicesToRun);
    }

However, this code only executes Service1 and not Service2. Both Service1 and Service2 execute by themselves. Any ideas?

+3  A: 

I would think you would want to create a sub service model where one could start any number of sub services from the main windows service.

public interface ISubService
{
   void Initialize( XmlElement xmlSection );
   bool Start( );
   void RequestStop( );
   void Stop( TimeSpan timeout );
}

Then maybe a base Threaded Service class..

public abstract class ThreadedService : ISubService
{
     private Thread m_thread;

     private ThreadedService( )
     {
        m_thread = new Thread( new ThreadStart( StartThread ) );
     }

     // implement the interface
}

Configure your services through the app.config and an IConfigurationSectionHandler...

public class ServiceConfigurationHandler : IConfigurationSectionHandler
{
   public ServiceConfigurationHandler() { }

   public object Create(object parent, object configContext, XmlNode section)
   {
       return new ServiceConfiguration((XmlElement)section);
   }
}

Something to handle the config sections...

public class ServiceConfiguration
{
   public static readonly ServiceConfiguration Current = (ServiceConfiguration)ConfigurationManager.GetSection("me/services");

   private List<ISubService> m_services;
   private string m_serviceName;

   internal ServiceConfiguration(XmlElement xmlSection)
   {
       // loop through the config and initialize the services
       // service = createinstance(type)..kind of deal
       // m_services.Add( service );
   }

   public void Start( )
   {
       foreach( ISubService service in m_services ) { service.Start( ); }           
   }
   public void Stop( ) { ... }
}

then you simply create however many threadedservice based classes you need for your sub services, and throw them all into the app.config...something like..

<me>
  <services>
     <service type="my.library.service1,my.library" />
     <service type="my.library.service2,my.library" />
  </services>
</me>

and lastly, in your actual service code, just have to do ServiceConfiguration.Current.Start( ) on the start, and Service.Configuration.Current.Stop( ) in the exit.

Hope that helps!

Sean
This is an interesting idea. Would this allow us to compile new libraries independently and add them to the service without having to recompile the service by adding them to the app.config? This would be an extremely extensible solution!
Jeremy Odle
Yeah, that was totally the intent with this solution. We were continually adding mini services and did not want to have to touch the windows service handler. Drop a new line in the app config, and your're good.
Sean