internal class GreetService : ServiceBase
{
	protected virtual IGreeter Greeter
	{
		get;
		private set;
	}
	
	protected virtual ILogger Logger
	{
		get;
		private set;
	}
		
	public GreetService(IServiceNameProvider serviceNameProvider, ILogger logger, IGreetServiceWorker worker)
	{
		serviceNameProvider.ThrowIfNull("serviceNameProvider");
		
		ServiceName =
			serviceNameProvider.ServiceName
				.ThrowIfNullOrEmpty("serviceNameProvider.ServiceName");
		
		Logger = logger.ThrowIfNull("logger");
		Worker = worker.ThrowIfNull("worker");
		
		CanStop = true;
		AutoLog = true;
	}
	
	protected IGreetServiceWorker Worker
	{
		get;
		set;
	}

	protected override void OnStart(String[] args)
	{
		Logger.Message("Starting service.");
		
		if (Worker.Started)
		{	
			try
			{
				Worker.Start();
				
				Logger.Message("Service started.");
			}
			catch (Exception ex)
			{
				Logger.ExceptionAlone(ex);
			}
		}
		else
		{
			Logger.Message("Cannot start service. Service is already running.");
		}
	}

	protected override void OnStop()
	{
		Logger.Message("Stopping service.");
		Worker.Stop();
		Logger.Message("Service stopped.");
	}
}